在其导航项中带有搜索栏的连续视图控制器会在对推动和弹出动画设置动画时导致视图模糊

时间:2019-03-05 20:09:22

标签: ios swift uiviewcontroller uinavigationcontroller uisearchcontroller

我有一个UINavigationController,其中包含两个在故事板中设置的UIViewControllers

enter image description here

每个控制器的导航项中都包含UISearchBar中的以下行中的viewDidLoad()

navigationItem.searchController = UISearchController(searchResultsController: nil)

将第二个视图控制器推到导航堆栈上时,在第一个视图中可见搜索栏时,动画无法正确渲染:导航高度无法平滑过渡到正确的高度-过渡为下一个导航项目(如果它的搜索栏可见),然后在动画完成后捕捉到正确的尺寸。这会导致动画过程中部分视图被遮挡。

请参阅随附的录音,同时显示“正常”动画(隐藏搜索栏时)和不正确的动画:

我还创建了一个very simple reproduction of this issue,它的视图控制器中只有7行代码,从而证明了这个问题。

有没有办法防止这种情况发生?

1 个答案:

答案 0 :(得分:0)

-更新-

链接到一个非常类似的问题。.Broken UISearchBar animation embedded in NavigationItem

似乎UINavigationController有问题。将函数移动到viewDidAppear可以防止初始推送的错误。但是,它会导致NSException。

Only one palette with a top boundary edge can be active outside of a transition.

可以通过在主线程中设置searchController来缓解这种情况。

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    if navigationItem.searchController == nil { // To prevent search bar from being lost on pop
        DispatchQueue.main.async {
            self.navigationItem.searchController = UISearchController(searchResultsController: nil)
        }
    }
}