【问题标题】:Back button animation with large title jumps带有大标题跳转的后退按钮动画
【发布时间】:2018-03-01 06:46:04
【问题描述】:

我们有两个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,而不是像 Messages App 中那样正常的 grow to large title 动画。

如果我点击标签栏图标作为“返回”操作,它会执行正确的过渡动画。

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

【问题讨论】:

标签: ios animation uiviewcontroller uinavigationcontroller


【解决方案1】:

在第二个视图控制器上将largeTitleDisplayMode 设置为.never 您无需将prefersLargeTitles 设置为false

为了澄清这里的事情,您必须直接为视图控制器的navigationItem 设置largeTitleDisplayMode,而不是导航控制器!

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

【讨论】:

  • 这将导致导航栏保持较大但后退动画看起来正确。我希望第二个 VC 确实有一个“小标题”,第一个是大标题。如果我将 prefersLargeTitles 设置为 false,它只会将标题缩小为一个小标题。
  • @BennX,这是一个正确的解决方案,我遇到了同样的问题,我刚刚测试过,谢谢戴夫!
  • viewDidLoad 中添加self.navigationItem.largeTitleDisplayMode = .never 而不是在viewWillAppear
  • 说真的,这让我每次都。 Apple 疯狂的布局默认设置让我发疯了。
【解决方案2】:

@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
        }
    }
}

【讨论】:

  • 完美运行!
【解决方案3】:

我有同样的过渡错误:从大标题到小标题或倒退。它没有从一种状态增长/减少到另一种状态,但它在屏幕上保持丑陋 1 秒,然后只是从大跳到小,反之亦然。

简单的解决方案:

确保每个视图控制器在 Storyboard 中都有一个 navigationItem。

并为每个navigationItem设置对应的Large Title 价值:

另外,您不需要在viewDidLoadviewWillAppear 等中设置与 largeTitle 相关的任何内容。正是我在上面展示的。

【讨论】:

    【解决方案4】:

    关闭大标题后,应立即对导航栏进行强制布局

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 2014-09-20
      • 2018-12-18
      • 1970-01-01
      相关资源
      最近更新 更多