我有一个视图控制器,它有一个包含聊天列表的表视图,一个包含在导航项中的搜索控制器(iOS 11特性)。
let searchController = UISearchController(searchResultsController: nil)
searchController.dimsBackgroundDuringPresentation = false
navigationItem.searchController = searchController
definesPresentationContext = true当用户在表视图中点击聊天时,应用程序会使用另一个包含聊天消息的表视图推送一个新的视图控制器。它的工作原理是:

问题是,当用户激活搜索控制器,找到一些聊天并点击它时,包含有聊天消息的表视图的推视图控制器使用不应该发生的表视图做一些非常奇怪的动画。

我在实际导航之前加载数据,并使用表视图上的viewDidLoad仅使用reload()将其绑定到表视图中的表视图。有问题的表视图使用自动布局和自定义单元格。
这个问题与UITableView has unwanted animation when reloadData is called非常相似,但对我来说,只有当iOS 11搜索控制器处于活动状态时才会发生这种情况。
编辑:如果我删除tableView.rowHeight = UITableViewAutomaticDimension并使用固定高度使用func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat,那么问题仍然存在
发布于 2018-03-18 09:50:04
就我个人而言,在呈现新的视图控制器之前,我只需要隐藏searchView控制器。(例如,将UIView.animates与完成处理程序一起使用)
我不打算进一步研究,因为自从iOS11以来,在安全区管理中存在一个深奥的问题。窃听器?)
即使是发射屏幕布局也没有得到正确处理。如此多的专业标志错过了他们的中间部分在启动!
发布于 2018-03-19 10:42:17
如果您只是在推出新的searchBar之前隐藏viewController,那么它可能会解决您的问题。
您需要为searchBarCancelButton创建一个全局变量,并在搜索某些内容时从其子视图中找到cancel按钮。
let buttons = searchController.searchBar.subviews.first?.subviews.filter { (view) -> Bool in
return NSStringFromClass(view.classForCoder) == "UINavigationButton"
} as? [UIButton]
searchBarCancelButton = buttons?.first然后你可以手动取消它。
self.searchBarCancelButton?.sendActions(for: .touchUpInside)发布于 2018-03-08 16:31:51
您可以尝试在去队列和设置单元格的内容之后立即调用cell.layoutIfNeeded()。
https://stackoverflow.com/questions/49177696
复制相似问题