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

时间:2018-01-24 04:31:15

标签: ios swift uinavigationcontroller uinavigationbar

iOS 11 中,当向 navigationItem.titleView <添加搜索栏时,搜索栏现在会将导航栏高度更改为 56dp / p>

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

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

enter image description here enter image description here

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

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

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

    if #available(iOS 11, *) {
        navigationController?.view.layoutSubviews()
    }
}

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

2 个答案:

答案 0 :(得分:3)

使用此功能,可以保持搜索栏的高度不变

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

答案 1 :(得分:1)

我尝试了很多不同的功能。 这是唯一真正有用的东西

OBJ C: if (@available(iOS 11, *)) { self.navigationController.view.layoutSubviews; }

SWIFT:

if #available(iOS 11, *) {
    self.navigationController.view.layoutSubviews()
 }