我正在开发基于导航的应用程序。我有几个视图控制器,我在不同的场合推入导航控制器。以下是我用来推送新View Controller的代码。
AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil];
[self.navigationController pushViewController:anotherViewController animated:YES];
[anotherViewController release];
我注意到的一件事是,当按下新的视图控制器时,导航栏也会动画(滑动)。我在导航栏中有一个后退按钮,标题文本和右键。所以当导航栏动画时看起来很奇怪。
是否有办法保持导航栏固定,并且只有在推送新的视图控制器时才会对视图进行动画处理?
答案 0 :(得分:0)
我尝试了很多不同的方法,但没有任何效果。最后我使用了一种解决方法:
1)将第一个视图控制器的当前视图(self.view)移交给第二个视图控制器 2)使用例如pushViewController淡出过渡。将第二个视图控制器设置为动画的委托,以通知第二个控制器转换是否完成 3)在第二个视图控制器的viewDidLoad中保存第二个视图控制器的视图,并将第一个视图控制器的视图设置为self.view
现在,显示应该看起来像第一个视图控制器的内容,第二个视图控制器带有导航栏(如果是的话,还有工具栏)。
最后在第二个视图控制器中(在动画的委托方法中)执行您要为内容执行的转换,例如翻转。
基本上是有效的。我仍然要解决一些问题,包括正确的视图位置以及在我的应用的第一个视图控制器中恢复视图。
但至少应该给你一个提示。
更新:修复了剩余的问题。这有点棘手,因为第一个视图控制器驻留在scrollview中。翻转并不是什么大不了的事,但重新回到滚动视图是件令人讨厌的事情。
答案 1 :(得分: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()
}
}
}
答案 2 :(得分:-1)
在Apple的Photo应用程序中查看图像时,导航栏会隐藏,以提供更好的图像视图。隐藏导航栏很容易。虽然与Photo应用程序不完全相同,但此技术将隐藏并显示导航栏,并可选择为过渡设置动画。