更改导航栏“prefersLargeTitles”时的平滑过渡

Posted

技术标签:

【中文标题】更改导航栏“prefersLargeTitles”时的平滑过渡【英文标题】:Smooth transition when changing navigation bar "prefersLargeTitles" 【发布时间】:2018-09-16 21:57:31 【问题描述】:

我有一个位于导航堆栈上的视图控制器 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 = falsenavigationBar.prefersLargeTitles = true 的变化有点小问题。有什么办法可以让这更顺畅吗?

非常感谢

【问题讨论】:

【参考方案1】:

您应该通过您想要影响的特定视图控制器的导航项来更改行为,而不是直接通过导航控制器更改首选项。

// 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 中的行。

【讨论】:

非常感谢,这行得通。当ViewControllerA 推动ViewControllerB 时,导航栏尺寸缩小并垂直向上移动;它显示黑色的“基本”屏幕。可以改变这种黑色吗?谢谢 @Callam In ViewControllerA 我想你想要navigationController?.navigationBar.prefersLargeTitles = true 而不是navigationItem.largeTitleDisplayMode = .always 根据 largeTitleDisplayMode 的文档:"如果导航栏的 prefersLargeTitles 属性为 false,则该属性没有效果,并且导航项的标题始终显示为小标题。” 设置prefersLargeTitles = true 时,在这种情况下不必同时设置largeTitleDisplayMode = .always - 现在尝试一下。

以上是关于更改导航栏“prefersLargeTitles”时的平滑过渡的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 prefersLargeTitles 更改标题注册表?

iOS 11 prefersLargeTitles 以 uibutton 作为标题

iOS 11 在导航栏中自定义搜索栏

当 prefersLargeTitles 为 true 时自定义 NavigatioItem TitleView

UINavigationBar.prefersLargeTitles 打开时的错误 UIRefreshControl 行为

默认情况下隐藏大型导航标题栏