Анимации для UINavigationController нажать не правильным отображением навигации
В пользовательском сегменте у меня есть следующий простой переход:
- (void) perform {
UIViewController *src = (UIViewController *) self.sourceViewController;
UIViewController *dst = (UIViewController *) self.destinationViewController;
[UIView transitionWithView:src.navigationController.view duration:1
options:UIViewAnimationOptionTransitionFlipFromBottom
animations:^{
[src.navigationController pushViewController:dst animated:NO];
}
completion:NULL];
}
Представление содержимого прекрасно анимируется. Однако при выполнении анимации панель навигации в верхней части имеет беспорядочную компоновку (кнопки все забиты в верхнем левом углу, без заголовка), появляющуюся только тогда, когда анимация закончена. Кто-нибудь знает, что я сделал не так и как это исправить? Спасибо!
2 ответа:
Выяснил мою проблему. Исходный код действительно неверен, учитывая, как UINavigationController работает и взаимодействует с uiviewcontrollers, которыми он управляет. (Досадно, что такие вещи, как то, что я сделал в ОП, можно найти в качестве решения в более старых сообщениях SO.)
Вот код, который работает для меня (с одной незначительной оговоркой):
- (void) perform { UIViewController *src = (UIViewController *) self.sourceViewController; UIViewController *dst = (UIViewController *) self.destinationViewController; [UIView transitionFromView:src.view toView:dst.view duration:1 options:UIViewAnimationOptionTransitionFlipFromBottom completion:nil]; [UIView transitionFromView:src.navigationItem.titleView toView:dst.navigationItem.titleView duration:1 options:UIViewAnimationOptionTransitionFlipFromBottom completion:nil]; [src.navigationController pushViewController:dst animated:NO]; }
Придирка: это будет анимировать навигационную панель отдельно от представления содержимого, так что у вас есть две части листать вместо всего экрана. Я изначально пытался чтобы сделать:
[UIView transitionFromView:src.navigationController.view toView:dst.navigationController.view
Но это не удается, потому что 1) свойство navigationController назначения еще даже не установлено, пока оно не нажато на навигационный контроллер, и 2) даже если бы это было так, я бы имел в виду то же самое представление! Я забыл, что
Представление для навигационного контроллера - это просто контейнер для нескольких другие виды, включая панель навигации, дополнительную панель инструментов и просмотр пользовательского содержимого...Хотя содержание самого виды панели навигации и панели инструментов изменения, сами взгляды делают нет...объект навигационного контроллера строит содержимое панель навигации динамически использует элементы навигации (экземпляры класс UINavigationItem), связанный с контроллерами вида на навигационный стек. Чтобы изменить содержимое панели навигации, поэтому необходимо настроить элементы навигации для пользовательского представления контроллеры. (docs)