具有大标题跳跃的后退按钮动画

时间:2017-09-20 09:22:29

标签: ios animation uiviewcontroller uinavigationcontroller

我们有两个UIViewController UINavigationController

viewWillAppear(_ animated: Bool)内部的第一个VC中,我们做了:

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if #available(iOS 11.0, *) {
            navigationController?.navigationBar.prefersLargeTitles = true
            navigationController?.navigationItem.largeTitleDisplayMode = .always
        }
 ....

在第二个VC的内部,我们在viewWillAppear(_ animated: Bool)

内部取消了该行为
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if #available(iOS 11.0, *) {
        navigationController?.navigationBar.prefersLargeTitles = false
    }
...

第二个VC的过渡动画是平滑的,而点击自动生成的后退按钮会导致导航控制器标题创建一个奇怪的jump to large title而不是正常的grow to large title动画,就像在消息中一样应用

如果我点击标签栏图标为"返回"操作,它做正确的过渡动画。

知道什么可能导致该问题或我如何解决它?

4 个答案:

答案 0 :(得分:7)

第二个视图控制器上的

largeTitleDisplayMode设置为.never 您无需将prefersLargeTitles设置为false

为了澄清这里的内容,您需要直接为视图控制器的largeTitleDisplayMode设置navigationItem,而不是导航控制器!

self.navigationItem.largeTitleDisplayMode = .never // This fixes the issue
self.navigationController?.navigationItem.largeTitleDisplayMode = .never // This doesn't work / Title will stay large

答案 1 :(得分:0)

@dave的答案对我有用!谢谢!这是我全部使用的代码:

FirstViewController:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.largeTitleDisplayMode = .always
            navigationController?.navigationBar.prefersLargeTitles = true
        }
    }
}

SecondViewController:

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if #available(iOS 11.0, *) {
            navigationItem.largeTitleDisplayMode = .never
        }
    }
}

答案 2 :(得分:0)

我有一个相同的过渡错误:从大标题到小标题或向后。它并没有从一种状态增加/减少到另一种状态,但是在屏幕上停留了丑陋的状态1秒钟,然后从大状态跳到小状态,反之亦然。

简单的解决方案:

  

确保每个视图控制器在情节提要中都有一个NavigationItem。

visualization

  

然后为每个navigationItem设置相应的Large Title   值:

Navigation Item inside the view stack.

此外,您无需在viewDidLoadviewWillAppear等中设置与largeTitle相关的任何内容。就是我上面显示的内容。

答案 3 :(得分:0)

应该在关闭大标题后立即强制布局导航栏

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    
    navigationController?.navigationBar.prefersLargeTitles = false
    navigationController?.navigationBar.layoutIfNeeded()
}

这会立即取消大导航标题。