在动画推送和弹出时,导航项中带有搜索栏的连续视图控制器会导致视图模糊[重复]
Posted
技术标签:
【中文标题】在动画推送和弹出时,导航项中带有搜索栏的连续视图控制器会导致视图模糊[重复]【英文标题】:Successive view controllers with search bars in their navigation items cause obscuring of view when animating push and pop [duplicate] 【发布时间】:2019-03-05 20:09:21 【问题描述】:我有一个UINavigationController
,其中包含两个UIViewControllers
,在情节提要中设置:
这些控制器中的每一个都有一个UISearchBar
,在viewDidLoad()
中的以下行中包含在其导航项中:
navigationItem.searchController = UISearchController(searchResultsController: nil)
当第二个视图控制器被推入导航堆栈而搜索栏在第一个视图中可见时,动画不会正确呈现:导航高度不会平滑过渡到正确的高度 - 它会过渡到下一个导航项如果它的搜索栏可见,然后在动画完成时捕捉到正确的大小。这会导致部分视图在动画期间被遮挡。
查看附件记录,显示“正常”动画(搜索栏隐藏时)和错误动画:
我还创建了一个very simple reproduction of this issue,它的视图控制器中只有 7 行代码,这说明了这个问题。
有什么办法可以防止这种情况发生吗?
【问题讨论】:
看起来导航高度正在考虑搜索栏的框架。我们将需要查看有关如何转换/创建导航栏高度的代码,以便更彻底地进行调试。 我自己并没有真正改变身高。 segues 在情节提要中定义,我对导航项所做的唯一调整是分配给navigationItem.searchController
属性。我添加了一个屏幕截图和一个简单的复制存储库。
【参考方案1】:
-- 更新--
链接到一个非常类似的问题..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)
【讨论】:
这似乎并不能阻止第一次推送转场的问题。不过,后续的推送和弹出都可以。但是,这对我来说不是一个可行的解决方案,因为它会导致在导航回第一个视图时丢失任何搜索状态(例如搜索是否处于活动状态,搜索栏中的文本是什么)。我也试过:if navigationItem.searchController == nil navigationItem.searchController = UISearchController(searchResultsController: nil)
,但这根本解决不了问题。
更新答案以解决您的问题。
这确实可以正常工作,但是当搜索栏处于活动状态时,似乎被推送到导航堆栈的视图控制器完全缺少导航项!你说得对,这是一个重复的问题,谢谢你让我知道。
我遇到了另一种方法 - 我在原始问题上有 left an answer 并已投票关闭这个问题。感谢您的帮助。以上是关于在动画推送和弹出时,导航项中带有搜索栏的连续视图控制器会导致视图模糊[重复]的主要内容,如果未能解决你的问题,请参考以下文章
UINavigationController 的背景图像在视图控制器被推送或弹出时保持静止并且不动画