更改导航栏"prefersLargeTitles"时实现平滑过渡

3

我有一个视图控制器,它被 pushed 到导航栏堆栈中。该堆栈具有 navigationBar.prefersLargeTitles = true,而这个新的视图控制器则具有 navigationBar.prefersLargeTitles = false。我使用以下代码在被推入堆栈的视图控制器中实现这一点:

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

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

然而,当我返回到呈现的视图控制器时,从 navigationBar.prefersLargeTitles = false 更改为 navigationBar.prefersLargeTitles = true 的导航栏变化有点卡顿。有没有什么方法可以使这更加流畅?感谢许多。
1个回答

17

不要通过导航控制器直接更改偏好设置,而应通过特定视图控制器的导航项更改行为。

// Root UIViewController
class ViewControllerA: UIViewController {

    override func viewDidLoad() {

        super.viewDidLoad()

        navigationController?.navigationBar.prefersLargeTitles = true
        navigationItem.largeTitleDisplayMode = .always
    }
}

// Pushed UIViewController
class ViewControllerB: UIViewController {

    override func viewDidLoad() {

        super.viewDidLoad()

        navigationItem.largeTitleDisplayMode = .never
    }
}

你可以删除在viewWillAppearviewWillDisappear中的代码行。


1
很好,谢谢,这个方法可以正常工作。当 ViewControllerA 推出 ViewControllerB 时,导航栏会收缩并向上移动;它会显示出黑色的“底部”屏幕。能否更改此黑色的颜色?谢谢。 - ajrlewis
@Callam 在 ViewControllerA 中,我认为你想要使用 navigationController?.navigationBar.prefersLargeTitles = true 而不是 navigationItem.largeTitleDisplayMode = .always。根据大标题显示模式的文档说明:“如果导航栏的 prefersLargeTitles 属性为 false,则此属性无效,并且导航项的标题始终显示为小标题。”在设置 prefersLargeTitles = true 时,在这种情况下无需同时设置 largeTitleDisplayMode = .always - 我刚才试过了。 - Scott Carter

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