禁用导航栏动画

3

我正在开发一个基于导航的应用程序。我有几个视图控制器,它们在不同的情况下被推送到导航控制器中。以下是我用来推送新视图控制器的代码。

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

我注意到的一件事是,当新的视图控制器被推出时,导航栏也会动画(滑动)。我在导航栏中有一个返回按钮、标题文本和右侧按钮。所以当导航栏被动画时,它看起来很奇怪。

有没有什么办法让导航栏保持固定,只有在推出新的视图控制器时才进行动画?

3个回答

0

我尝试了很多不同的方法,但都没有起作用。最终我使用了一个解决方法:

1)将第一个视图控制器的当前视图(self.view)移交给第二个视图控制器 2)使用pushViewController进行推送,例如淡入淡出过渡。将第二个视图控制器设置为动画的代理,以通知第二个控制器是否完成转换 3)在第二个视图控制器的viewDidLoad中保存第二个视图控制器的视图,并将第一个视图的视图设置为self.view

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

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

基本上这样可以工作。我仍然需要解决一些关于正确位置和恢复在我的应用程序中第一个视图控制器的问题。

但是这应该至少为您提供了一些提示。

更新:解决剩余问题。这有点棘手,因为第一个视图控制器驻留在滚动视图中。翻转出去不是什么大问题,但是翻回到滚动视图是一件麻烦的事情。


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()
            }
        }
}

-1
在苹果的照片应用程序中查看图片时,导航栏会隐藏以提供更好的图像视图。隐藏导航栏很容易。虽然这种技术与照片应用程序不完全相同,但它可以隐藏和显示导航栏,并提供动画过渡选项。

1
这并没有回答问题。 - James A Mohler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接