禁用导航栏的动画

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了禁用导航栏的动画相关的知识,希望对你有一定的参考价值。

我正在开发基于导航的应用程序。我有几个视图控制器,我在不同的场合推入导航控制器。以下是我用来推送新View Controller的代码。

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

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

是否有任何方法可以保持导航栏固定,并且只有在推送新的视图控制器时才会对视图进行动画处理?

答案

我尝试了很多不同的方法,但没有任何效果。最后我使用了一个解决方法:

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

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

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

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

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

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

另一答案

迅速

硬但可行的解决方案:

你需要使用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()
            }
        }
}
另一答案

在Apple的Photo应用程序中查看图像时,导航栏会隐藏,以提供更好的图像视图。隐藏导航栏很容易。虽然与Photo应用程序不完全相同,但此技术将隐藏并显示导航栏,并可选择为过渡设置动画。

以上是关于禁用导航栏的动画的主要内容,如果未能解决你的问题,请参考以下文章

底部导航栏的 Oncreate 视图问题

将数据从活动传递到底部导航栏的片段

禁用隐藏导航栏的触摸

如何为导航到实现底部导航栏的活动中的上一个片段进行后推操作?

CSS实现动画特效导航栏

Ionic 2禁用没有导航栏的向后滑动