Представление UINavigationController в пользовательском модальном

Я пытаюсь представить UINavigationController из UINavigationController. Я использую новый элемент iOS 7 transitioningDelegate, и он отлично работает … за исключением того, что панель навигации начинает высокий, а затем сжимается, когда анимация закончена. Я предполагаю, что он сжимается, потому что панель не касается верхней части экрана, но почему она начинается с высокой? Могу ли я предотвратить это?

Обратите внимание, что панель начинается с высоты

Вот код анимации:

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext { UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIView* containerView = [transitionContext containerView]; if (toViewController.isBeingPresented) { [self presentModalView:toViewController.view fromView:fromViewController.view inContainerView:containerView withTransitionContext:transitionContext]; } else { [self dismissModalView:fromViewController.view fromView:toViewController.view withTransitionContext:transitionContext]; } } - (void)presentModalView:(UIView*)modalView fromView:(UIView*)presentationView inContainerView:(UIView*)containerView withTransitionContext:(id<UIViewControllerContextTransitioning>)transitionContext { [containerView addSubview:modalView]; presentationView.userInteractionEnabled = NO; modalView.layer.cornerRadius = 5; modalView.clipsToBounds = YES; CGRect finalFrame = CGRectInset(presentationView.frame, 10, 20); modalView.frame = CGRectOffset(finalFrame, 0, CGRectGetHeight(presentationView.frame)); [UIView animateWithDuration:animationDuration animations:^{ modalView.frame = finalFrame; presentationView.alpha = 0.2; } completion:^(BOOL finished) { [transitionContext completeTransition:YES]; }]; } 

One Solution collect form web for “Представление UINavigationController в пользовательском модальном”

У меня есть решение этой проблемы.

С http://blog.jaredsinclair.com/post/61507315630/wrestling-with-status-bars-and-navigation-bars-on-ios-7 , номер 4:

UINavigationController будет изменять высоту своего UINavigationBar до 44 пунктов или 64 точки, в зависимости от довольно странного и недокументированного набора ограничений. Если UINavigationController обнаруживает, что верхняя часть его ракурса визуально смежна с вершиной UIWindow, тогда он рисует свою навигационную панель высотой 64 точки. Если верх его представления не соприкасается с вершиной UIWindow (даже если он выключен только одной точкой), тогда он рисует свою навигационную панель «традиционным» способом с высотой 44 точки. Эта логика выполняется UINavigationController, даже если несколько дочерних элементов находятся внутри иерархии контроллера представления вашего приложения. Невозможно предотвратить такое поведение.

Поэтому ваша проблема заключается в том, что UINavigationController обнаруживает, что кадр его представления смежен с вершиной UIWindow в начале анимации. Это связано с тем, что когда вы добавили modalView в качестве подчиненного элемента containerView , кадр modalView равен {0,0,0,0}. Поскольку этот кадр будет визуально смежным с вершиной UIWindow , UINavigationController рисует свой UINavigationBar с высотой 64 точки. Когда анимация завершена, новый кадр навигационного контроллера больше не является непрерывным с верхним окном, и он рисует навигационную панель высотой 44.

Одним из решений является добавление вида контроллера навигации в представление контейнера ПОСЛЕ установки его кадра. Вот так,

  - (void)presentModalView:(UIView*)modalView fromView:(UIView*)presentationView inContainerView:(UIView*)containerView withTransitionContext:(id<UIViewControllerContextTransitioning>)transitionContext { presentationView.userInteractionEnabled = NO; modalView.layer.cornerRadius = 5; modalView.clipsToBounds = YES; CGRect finalFrame = CGRectInset(presentationView.frame, 10, 20); modalView.frame = CGRectOffset(finalFrame, 0, CGRectGetHeight(presentationView.frame)); [containerView addSubview:modalView]; [UIView animateWithDuration:animationDuration animations:^{ modalView.frame = finalFrame; presentationView.alpha = 0.2; } completion:^(BOOL finished) { [transitionContext completeTransition:YES]; }]; } 

Это должно решить вашу проблему, поскольку панель навигации всегда будет рисоваться с высотой 44 точки в анимации. Я не знаю, как сохранить высоту навигационной панели 64 точки, потому что это связано с запугиванием навигационного контроллера, считая, что оно смежно с верхней частью окна.

  • Кнопки на панели навигации не выбирают цвет оттенка окна
  • Невозможно установить название UINavigationItem
  • Как добавить диспетчеры просмотра в контроллер навигации?
  • self.navigationController.navigationBar.hidden = TRUE не работает на одном UIViewController
  • EKEventEditViewController не поддерживает то, что вы нажимаете на NavController? См. Код и прилагаемая ошибка.
  • Нажатие кнопки назад (backBarButtonItem) в KIF?
  • Как назначить мой CustomNavigationBar UINavigationController?
  • UINavigationController и свойство навигационного контроллера UIViewController
  • Как добавить заголовок на основе раскадровки и CustomTableCell в «Панель поиска и поисковый контроллер дисплея»,
  • Панель навигации исчезает при программном нажатии
  • Кнопка панели навигации Элемент «Создать» сдвигается вправо во время segue
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.