在推送过渡期间响应导航栏高度变化

Dav*_*ees 8 uinavigationbar uinavigationcontroller ios swift

iOS的11搜索栏现在将改变导航栏高度56dp添加一个搜索栏的时候navigationItem.titleView

我喜欢高度变化,并不打算强迫高度保持在44dp或更低.

不幸的是,当从一个视图控制器转换到另一个视图控制器时,将使用较大的导航栏绘制推出的视图,然后在转换完成后更改条形高度.看起来有点像这样:

在此输入图像描述 在此输入图像描述

我需要一种方法让导航控制器识别过渡期间的高度变化,以便它可以设置较小的动画并正确绘制视图.

我有一个我不喜欢的当前修复,因为它有点跳跃,这是应用程序必须做的更多工作,并且它必须重新评估它的视图,无论它被推出哪个视图控制器.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    if #available(iOS 11, *) {
        navigationController?.view.layoutSubviews()
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我还没有发现任何关于堆栈溢出的类似问题,来自WWDC的任何评论以及官方苹果文档中的任何内容.我见过很多应用程序处理这个问题.苹果联系人应用程序将创建看起来像两个导航栏,并将在它们之间移动而不动画高度变化和fb messenger应用程序将完美地在高度之间转换,甚至允许交互式弹出过渡.

小智 3

使用这个,它将保持搜索栏的高度固定

if #available(iOS 11.0, *) {
        searchBar.heightAnchor.constraint(equalToConstant: 44.0).isActive = true
    }
Run Code Online (Sandbox Code Playgroud)