2010-03-05 5 views
2

Я работаю над навигационным приложением. У меня есть несколько контроллеров просмотра, которые я нажимаю на контроллер навигации в разных случаях. Ниже приведен код, который я использую для ввода нового View Controller.Отключить анимацию навигационной панели

AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil]; 
[self.navigationController pushViewController:anotherViewController animated:YES]; 
[anotherViewController release]; 

Одна вещь, которую я заметил, что, когда новый контроллер представления выталкивается панель навигации также анимированный (скользил). У меня есть кнопка возврата, текст заголовка и правая кнопка в панели навигации. Так что это выглядит странно, когда панель навигации анимирована.

Есть ли способ сохранить фиксированную панель навигации, а представление только анимируется при нажатии на новый контроллер представления?

ответ

0

Я пробовал много разных подходов, но ничего не работало. Наконец, я использую обходное решение:

1) Перенесите текущий вид (self.view) первого контроллера представления на второй контроллер вида 2) Сделайте pushViewController, например. переход затухания. Установите второй контроллер представления в качестве делегата анимации, чтобы сообщить второму контроллеру, если переход завершен. 3) В viewDidLoad второго контроллера просмотра сохраняют вид второго контроллера представления и устанавливают вид первого в виде self.view

Теперь дисплей должен выглядеть как содержимое первого контроллера представления с навигационной панелью (и панель инструментов, если таковая имеется) второй.

Наконец, выполните во втором контроллере представления (в методе делегата анимации) переход, который вы хотите сделать для контента, например. кувырок.

В основном, что работает. Мне еще нужно решить некоторые проблемы с правильной позицией представления и восстановить представление в первом контроллере представления для моего приложения.

Но это должно дать вам хотя бы намек.

Обновление: Исправлены оставшиеся проблемы. Это было немного сложно, потому что первый контроллер представления находится в scrollview. Перелистывание не было большим делом, но перелистывание назад в свиток выглядело неприятно.

-1

Навигационная панель скрывается во время просмотра изображений в приложении «Фото Apple», чтобы обеспечить лучший вид изображения. Скрыть навигационную панель легко. Хотя это не то же самое, что и приложение «Фото», эта техника скроет и покажет навигационную панель с возможностью анимирования перехода.

+1

Это не дает ответа на вопрос. –

0

Swift

Трудно, но выполнимо решение:

Вы должны использовать UINavigationController методы делегата, чтобы выяснить, когда UIViewController показывается. Затем для каждого UIViewController необходимо создать логическую переменную типа isInitialized, которая поможет вам определить, когда UIViewController вставляется в стек или когда он отображается на задней панели следующего контроллера.

Ваш FirstViewController:

func navigationController(_ navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      if self.isInitialized { 
       var navigationBarAnimation = CATransition() 
       navigationBarAnimation.duration = 1.5 
       navigationBarAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 
       navigationBarAnimation.type = kCATransitionFade 
       navigationBarAnimation.subtype = kCATransitionFade 
       navigationBarAnimation.removedOnCompletion = true 
       self.navigationController?.navigationBar?.layer?.addAnimation(navigationBarAnimation, forKey: nil) 
       } 
       else 
       { 
         self.isInitialized = true; 
       } 
     } 
} 

func navigationController(_ navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      if self.isInitialized { 
       self.navigationController?.navigationBar?.layer?.removeAllAnimations() 
      } 
     } 
} 

Ваш SecondViewController:

func navigationController(_ navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      if !self.isInitialized { 
       var navigationBarAnimation = CATransition() 
       navigationBarAnimation.duration = 1.5 
       navigationBarAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 
       navigationBarAnimation.type = kCATransitionFade 
       navigationBarAnimation.subtype = kCATransitionFade 
       navigationBarAnimation.removedOnCompletion = true 
       self.navigationController?.navigationBar?.layer?.addAnimation(navigationBarAnimation, forKey: nil) 
         self.isInitialized = true; 
       } 
     } 
} 

func navigationController(_ navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      if self.isInitialized { 
       self.navigationController?.navigationBar?.layer?.removeAllAnimations() 
      } 
     } 
}