带有大标题的返回按钮动画跳跃

11

我们有两个带有UINavigationControllerUIViewController

在第一个呈现的VC中的 viewWillAppear(_ animated: Bool) 方法内,我们执行以下操作:

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

当点击自动生成的返回按钮时,第二个视图控制器的切换动画很流畅,但导航控制器标题会产生奇怪的 跳跃到大标题 而不是正常的 增长到大标题 动画,例如在 Messages 应用中。

如果我将选项卡栏图标作为“返回”操作进行单击,则可以执行正确的转换动画。

有什么想法可能会导致这个问题或如何解决它吗?


可能是向上滚动时隐藏大标题的重复问题。 - bemeyer
5个回答

22
在第二个视图控制器中,将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

1
这将导致导航栏保持大的大小,但后退动画看起来正确。我希望第二个视图控制器具有“小标题”,而第一个视图控制器具有大标题。只有当我将 prefersLargeTitles 设置为 false 时,它才会将标题减小到小标题。 - bemeyer
@BennX,这是一个正确的解决方案,我遇到了同样的问题并已经测试过了,谢谢 Dave! - Ivan Ičin
viewDidLoad 中添加 self.navigationItem.largeTitleDisplayMode = .never,而不是在 viewWillAppear 中添加。 - El Belga
说真的,每次都把我搞疯了。苹果公司的布局默认设置让我发疯。 - Echelon

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

完美运行! - Nicolai Harbo

1
在关闭大标题后,应该制作导航栏的强制布局。
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    
    navigationController?.navigationBar.prefersLargeTitles = false
    navigationController?.navigationBar.layoutIfNeeded()
}

这将立即取消大型导航标题。

0

对我来说,这是完全不同的事情。在我的项目中,我们为每个 VC 设置了一个自定义的无标题返回按钮。长期以来,标准的做法是设置一个空的 BarButtonItem,像这样:

navigationItem.backBarButtonItem = UIBarButtonItem()

删除那行代码修复了从一个有大标题的视图控制器切换到一个没有大标题的视图控制器时跳转返回按钮的问题。但是,我发现自从iOS 14以来,可以更加优雅地实现这个设计需求:

navigationItem.backButtonDisplayMode = .minimal

所以只需将设置新的BarButtonItem替换为设置显示模式即可。


0

我也遇到了同样的过渡缺陷:从大标题到小标题或反过来。它不是从一个状态到另一个状态逐渐增大/减小,而是在屏幕上难看地停留一秒钟,然后突然从大变小或者反之。

简单的解决方案:

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

Navigation Item inside the view stack.

对于每个导航项,设置相应的“大标题”值:

Navigation item attributes inspector

此外,在与大标题相关的viewDidLoadviewWillAppear等方面,您无需设置任何内容。只需按照我上面展示的方式即可。

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