2012-01-03 3 views
2

У меня есть два UITableViewControllers, так что, когда я нажимаю на первый UITableViewController, второй UITableViewController попадает в стек навигации и анимирует переход, как обычно. Я бы хотел, чтобы это произошло, когда я нажимаю дальше, анимируются только виды, а панель навигации не остается (остается прежней). Я получил очень близко к делать это на код ниже:Как отключить анимацию navigationBar?

- (void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    CATransition *navTransition = [CATransition animation]; 
    navTransition.duration = .5; 
    navTransition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    navTransition.type = kCATransitionPush; 
    navTransition.subtype = kCATransitionPush; 
    [self.navigationController.navigationBar.layer addAnimation:navTransition forKey:nil]; 

} 

Я ставлю этот код, и я также сделать так, заголовок и кнопки на обеих панелей навигации точно так же в каждом UITableViewController. Это почти работает, проблема в том, что навигационная панель мигает, когда происходит анимация. Есть ли способ заставить его не мигать, или есть ли другой хороший способ предотвратить анимацию навигационной панели (т.е. отключить анимацию на слое или что-то еще)?

ОБНОВЛЕНИЕ: У кого-нибудь есть другие идеи? Все еще борется с этим.

ответ

2

Это то, что я придумал. Вот код для первого ViewController в последовательности:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
     if (viewController == self) 
     { 
       if (self.isInitialized) 
       { 
         CATransition *navigationBarAnimation = [CATransition animation]; 
         navigationBarAnimation.duration = 1.5; 
         navigationBarAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];; 
         navigationBarAnimation.type = kCATransitionFade; 
         navigationBarAnimation.subtype = kCATransitionFade; 
         navigationBarAnimation.removedOnCompletion = YES; 
         [self.navigationController.navigationBar.layer addAnimation:navigationBarAnimation forKey:nil]; 
       } 
       else 
       { 
         self.isInitialized = YES; 
       } 
     } 
} 

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
     if (viewController == self) 
     { 
       if (self.isInitialized) 
       { 
         [self.navigationController.navigationBar.layer removeAllAnimations]; 
       } 
     } 
} 

Вот код для 2-го контроллера представления:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
     if (viewController == self) 
     { 
       if (!self.isInitialized) 
       { 
         CATransition *navigationBarAnimation = [CATransition animation]; 
         navigationBarAnimation.duration = 1.5; 
         navigationBarAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];; 
         navigationBarAnimation.type = kCATransitionFade; 
         navigationBarAnimation.subtype = kCATransitionFade; 
         navigationBarAnimation.removedOnCompletion = YES; 
         [self.navigationController.navigationBar.layer addAnimation:navigationBarAnimation forKey:nil]; 
         self.isInitialized = YES; 
       } 
     } 
} 

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
     if (viewController == self) 
     { 
       if (self.isInitialized) 
       { 
         [self.navigationController.navigationBar.layer removeAllAnimations]; 
       } 
     } 
} 

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

+0

Я использую код анимации в viewDidLoad, но я не уверен, когда, где и если я должен использовать removeAllAnimations, вы еще какие-нибудь комментарии? Заранее спасибо. – Jules

+0

@Jules - я уточнил ответ гораздо более подробно. Попробуйте это и дайте мне знать, как это происходит. Все должно работать нормально, но я сделал это некоторое время назад, так что дайте мне знать. –

+0

Подкласс 'UINavigationBar' и переопределить' popNavigationItemAnimated' http://www.petersimpson.me/blog/static-nav-bar/ – gav

1

Это может быть не лучший ответ/идея, но вы можете просто маскировать UINavigationBar во время анимации.

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

+0

Прохладная идея попробует это, если я не могу получить другой способ работы –

0

Swift

Вот решение в быстром

var isInitialized = false 

Ваш 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() 
      } 
     } 
} 
Смежные вопросы