这个问题在这里已有答案:
我有一个UINavigationController
,其中包含两个UIViewControllers
,设置在故事板中:
这些控制器中的每一个都在UISearchBar
中的以下行的导航项目中包含viewDidLoad()
:
navigationItem.searchController = UISearchController(searchResultsController: nil)
当第二个视图控制器被推到导航堆栈上而搜索栏在第一个视图中可见时,动画无法正确渲染:导航高度不会平滑过渡到正确的高度 - 它会过渡到下一个导航的大小item如果其搜索栏可见,则在动画完成时捕捉到正确的大小。这导致视图的一部分在动画期间被遮挡。
查看附加的录音,显示“正常”动画(隐藏搜索栏时),然后显示不正确的动画:
我还创建了一个very simple reproduction of this issue,在其视图控制器中只有7行代码,这证明了这个问题。
有没有办法可以防止这种情况发生?
- 更新 -
链接到一个非常类似的问题.. Broken UISearchBar animation embedded in NavigationItem
似乎UINavigationController是错误的。将func移动到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)
}
}
}