繁体   English   中英

如何在屏幕之间保留navigationItem.titleView?

[英]How to persist navigationItem.titleView between screen?

我正在使用NavigationController来管理三个屏幕。 所有三个屏幕共享一个共同的图像作为标题。 我在每个VC的viewWillAppear中设置图像如下:

self.navigationItem.titleView = myImageView

问题是每当按下/弹出屏幕,导航动画并且新图像将来自右侧或左侧时。 我希望图像能够持续存在并且保持在中间没有动画。

有没有办法禁用这个动画?

只有在viewWillAppear放置/设置titleView代码时,它才是可重现的。 它正在移动,因为viewWillAppear在第四次(push)和后退(pop)两种操作中都被调用。 将其设置为viewDidLoad ,它将解决此问题

override fun viewDidLoad() {
 super.viewDidLoad()
 self.navigationItem.titleView = myImageView
}

这个问题的另一个替代解决方案是

var isViewDidLoadCalled = false

override fun viewDidLoad() {
     super.viewDidLoad()
     isViewDidLoadCalled = true
}

override fun viewWillAppear(_ animated: Bool) {
     super. viewWillAppear(animated)

     if (isViewDidLoadCalled) {
       self.navigationItem.titleView = myImageView
       isViewDidLoadCalled = false
     }

 }

我建议使用viewDidLoad来设置你的titleView

另一个困难但可行的解决方案是

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM