Навигационная панель прыгает при загрузке вида

Я реализовал контроллер представления контейнера (ios5), и теперь я пытаюсь реализовать пользовательские анимации/переходы для переключения контроллеров представления.

Но у меня есть проблема при реализации любой анимации, в которой используется UINavigationController, результат не такой, как ожидалось. Например, если я выполняю переворот левой анимации при отображении контроллера с панелью навигации, положение панели навигации остается на 44 пикселя ниже исходного положения, и после выполнения анимации панель навигации плавно перемещается в исходное положение, которое на самом деле уродливый...

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

Это код, который я использую для флип-перехода

[self transitionFromViewController:fromViewController
                toViewController:toViewController
                        duration:1.0
                         options:UIViewAnimationOptionTransitionNone
                      animations:^{
                        [UIView beginAnimations:@"animation2" context:nil];
                        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
                        [UIView setAnimationDuration: 0.7];
                        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:NO]; 
                        [UIView commitAnimations];
                      }
                      completion:^(BOOL finished) {
                        [toViewController didMoveToParentViewController:self];
                        [fromViewController removeFromParentViewController];
                      }];

Я также пробовал следующее

[self transitionFromViewController:fromViewController
                toViewController:toViewController
                        duration:1.0
                         options:UIViewAnimationOptionTransitionFlipFromLeft
                      animations:^{
                      }
                      completion:^(BOOL finished) {
                        [toViewController didMoveToParentViewController:self];
                        [fromViewController removeFromParentViewController];
                      }];

person CSharpLearning    schedule 04.06.2012    source источник


Ответы (3)


Установите рамку панели навигации в соответствии с iphone или ipad и ее ориентацию, как это для портрета в iphone

 [self.navigationController.navigationBar setFrame:CGRectMake(0, 20, 320, 44)]; //for iphone  simarly for ipad and its orientation

Вам нужно изменить рамку панели навигации на ее фактическое положение в строке состояния, т.е. плюс 20

person Paresh Navadiya    schedule 04.06.2012
comment
Я забыл прокомментировать, что весь контент перемещается вверх, поэтому, если я установлю рамку панели навигации, представление содержимого все равно будет перемещаться. Я попытался установить оба фрейма (панель навигации и представление содержимого), но только панель навигации перемещается в исходное положение. - person CSharpLearning; 04.06.2012
comment
Я только что проверил рамку для панели навигации и ее правильность в viewDidLoad и viewWillAppear (x = 0, y = 0). Даже то, что панель навигации перемещается с y = высота строки состояния на y = 0... Странно... - person CSharpLearning; 04.06.2012
comment
Почему? Предположим, что и NavigationController, и панель навигации имеют фрейм с началом координат x=0 и y=0, не так ли? - person CSharpLearning; 04.06.2012
comment
но по мере его изменения мы меняем начало координат y = 20 - person Paresh Navadiya; 04.06.2012
comment
Я не понимаю, что вы имеете в виду. Если я изменю origin.y = 20, полоса будет помещена в y=20, так что да, не будет перехода к origin.y = 0, но тогда между строкой состояния и панелью навигации появится пробел. - person CSharpLearning; 05.06.2012
comment
измените происхождение y = 20, где он прыгает вверх, и снова установите y = 0, где он не прыгает. - person Paresh Navadiya; 05.06.2012

У меня похожая проблема с NavigationController и Container controller. На самом деле это была панель инструментов в нижней части окна. Мое решение состоит в том, чтобы сначала скрыть панель инструментов, а затем показать панель инструментов с анимацией после завершения основного перехода. Это похоже на часть всей анимации.

Вот как я скрываю и показываю панель инструментов:

[toNavController setToolbarHidden:YES];
[self transitionFromViewController:fromViewController
                toViewController:toNavController
                        duration:1.0
                         options:UIViewAnimationOptionTransitionFlipFromLeft
                      animations:^{
                      }
                      completion:^(BOOL finished) {
                        [toNavController didMoveToParentViewController:self];
                        [fromViewController removeFromParentViewController];

                        [toNavController setToolbarHidden:NO animated:YES];
                      }];
person goldenhordes    schedule 08.11.2012

В viewDidLoad установите для frame.origin.y значение 1. У вас все еще есть прыжки, но с 1 пикселем.

person VOX    schedule 16.05.2013