我有一个UINavigationController
,其中包含两个在故事板中设置的UIViewControllers
:
每个控制器的导航项中都包含UISearchBar
中的以下行中的viewDidLoad()
:
navigationItem.searchController = UISearchController(searchResultsController: nil)
将第二个视图控制器推到导航堆栈上时,在第一个视图中可见搜索栏时,动画无法正确渲染:导航高度无法平滑过渡到正确的高度-过渡为下一个导航项目(如果它的搜索栏可见),然后在动画完成后捕捉到正确的尺寸。这会导致动画过程中部分视图被遮挡。
请参阅随附的录音,同时显示“正常”动画(隐藏搜索栏时)和不正确的动画:
我还创建了一个very simple reproduction of this issue,它的视图控制器中只有7行代码,从而证明了这个问题。
有没有办法防止这种情况发生?
答案 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)
}
}
}