Анимации для 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 5

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)

Еще одна "придирка"? Я поставил

[src.navigationController pushViewController:dst animated:YES];

До

 [UIView transitionFromView ...  

Так, чтобы навигационный контроллер был доступен в пределах метода viewDidLoad назначения.