UISearchController 的 UISearchBar 在 UITableView 滚动时移位不正确并跳转

UISearchController's UISearchBar shifts incorrectly and jumps when UITableView is scrolled

在视频中,有点难以理解是怎么回事,所以我会尽力解释一下。 https://youtu.be/yOrCJB9yZlg

我的根视图中有 UIViewControllerUITableView。通过 Autolayout 绑定(绑定方式没有区别:绑定到 SuperView 或绑定到 SafeArea)。

SearchBar 添加如下: let search = UISearchController(searchResultsController: nil) self.navigationItem.searchController = search

当我慢慢滚动 table 时,大型导航栏和紧凑型导航栏之间的转换,然后是显示进出搜索栏的动画太快了。导航栏的搜索栏跳跃 in/out 而不是平滑 opened/closed;导航栏转换是在两种状态之间跳跃,大和紧凑,当您在屏幕上缓慢移动手指时,不会平滑地通过中间的半开状态,就像在系统应用程序(邮件、Phone、消息、联系人等)中一样。

我从一个空项目中制作了这个例子来演示这个问题;导航栏逻辑没有任何变化,或者根本没有任何逻辑。只有两个新的 VC 和这种奇怪的行为。

如果我创建 xCode 的 "Master-Details" 项目示例并向其中添加 UISearchController,它将正常工作。我认为是因为他们在里面使用 UITableViewController 而不是 UIViewController + UITableView

此行为的原因是什么以及如何解决?

你所做的是正确的。您是否在设备中尝试 运行 您的代码?感觉更像是模拟器中的一个故障。我试过你试过的方法,它在我的设备上运行良好。而故障发生在模拟器中。

参考这个article。他们已经一步一步地解释了过程。

这是一个已知问题,您的代码似乎没有问题。这个问题已经讨论过here

当您使用带有大导航标题的 UIScrollView 或其子类时会出现问题。它不起作用。当您改用 UICollectionViewControllerUITableViewController 时,问题就会消失。

我在搜索控制器转换和表格视图方面遇到了同样的问题。 like this 它的闪烁或 tableview 正在跳跃。搜索控制器在导航项上。

关键的解决方案是从您的视图控制器中删除安全区域指南,并将左上角右下角约束分配给您的表视图。会很顺利like this