2010-03-05 84 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)淡入淡出的过渡。将第二个视图控制器设置为动画的委托,以通知第二个控制器是否完成转换 3)在第二个视图控制器的viewDidLoad中保存第二个视图控制器的视图并将第一个视图的视图设置为self.view

现在,显示器应该与第一个视图控制器的内容看起来像第二个视图控制器的导航栏(如果有的话,还有工具栏)。

最后在第二个视图控制器(在委托动画的方法中)中执行要为内容执行的转换,例如翻转。

基本上是有效的。我仍然需要解决一些视图正确位置的问题,并在我的应用的第一个视图控制器中恢复视图。

但是这应该至少给你一个提示。

更新:修复了剩余的问题。这有点棘手,因为第一个视图控制器驻留在滚动视图中。翻转并不是什么大不了的事情,但是翻回滚动视图是一件令人讨厌的事情。

-1

导航栏在Apple的Photo应用程序中查看图像时隐藏,以提供更好的图像视图。隐藏导航栏很容易。虽然与Photo应用程序不完全相同,但此技巧将隐藏并显示导航栏,并带有一个用于为转换设置动画的选项。

+1

这不回答这个问题。 – 2012-12-06 01:01:47

0

斯威夫特

虽然艰苦但可行的解决方案:

您需要使用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() 
      } 
     } 
}