从iOS 11搜索控制器导航时,不需要的UITableView重新加载动画

时间:2018-03-08 16:16:00

标签: ios swift uitableview autolayout ios11

我有一个视图控制器,其中包含一个包含聊天列表的tableview,一个在导航项中添加的搜索控制器(iOS 11功能)

let searchController = UISearchController(searchResultsController: nil)
searchController.dimsBackgroundDuringPresentation = false
navigationItem.searchController = searchController
definesPresentationContext = true

当用户在表格视图中点击聊天时,应用程序会使用包含该聊天消息的另一个表格视图推送新的视图控制器。这就像它应该的那样:

enter image description here

问题在于,当用户激活搜索控制器,找到一些聊天并点击它时,包含带有聊天消息的表视图的推送视图控制器会执行一些非常奇怪的动画,其中包含不应发生的表视图< /强>:

enter image description here

我在实际导航之前加载数据,并使用表格视图上的viewDidLoad将其绑定到reload()中的表格视图。有问题的表格视图使用自动布局和自定义单元格。

问题与UITableView has unwanted animation when reloadData is called非常相似,但对我来说,只有当iOS 11搜索控制器处于活动状态时才会发生。

修改:如果我移除tableView.rowHeight = UITableViewAutomaticDimension并使用func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat使用固定高度问题仍然存在

8 个答案:

答案 0 :(得分:4)

如果您在推送新的viewController之前隐藏了searchBar,那么它可能会解决您的问题。

您需要为searchBarCancelButton创建一个全局变量,并在搜索某些内容时从其子视图中找到取消按钮

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)

答案 1 :(得分:0)

您可以尝试在出列并设置单元格内容后立即调用<div class="main"> <div class="left"></div> <div class="right"> <div class="up"></div> <div class="down"></div> </div> </div>

答案 2 :(得分:0)

iOS 11完全修改了安全区域API,包括滚动视图插入调整行为,这会在忽略时导致不需要的动画。因此,请使用不需要的动画禁用滚动视图的自动内容插入调整:

if #available(iOS 11.0, *) {
    tableView.contentInsetAdjustmentBehavior = .never
} else {
    // < iOS 11 logic
}

答案 3 :(得分:0)

就个人而言,我只是在呈现新视图控制器之前隐藏searchView控制器。 (例如,使用UIView.animates和完成处理程序)

我不会尝试进一步调查,因为自iOS11以来,安全区域管理存在一个深奥的问题。一个bug? :)

即使是启动屏幕布局也未正确处理。 这么多专业标志在发布时错过了他们的中间部分!

答案 4 :(得分:0)

请勿在{{1​​}}或reloadData()中调用viewDidLoad方法。而不是使用viewWillAppear中的空数据重新加载tableView,以便viewDidLoad不显示任何内容,然后在tableView调用viewDidAppear方法中加载所有聊天内容。这将限制tableView加载不需要的动画。

reloadData()

答案 5 :(得分:0)

根据附件,看起来由于自动布局,单元格元素的高度为零(UILabel or UIImageView),然后突然在表格视图重新加载时获取单元格内的数据增加导致此动画的高度(自动尺寸或其他)。

尝试在没有动画的情况下推动它或尝试设置修复单元格的高度和宽度,并检查它是否仍然显示此动画。

你是否在不调用UISearchBar的情况下进行了检查,如果在任何单元格上选择相同的动画正在发生?或者您是否尝试删除UISearchbar并在单元格上选择并检查动画部分?

请分享您的代码,以便我们更清楚地看到。

答案 6 :(得分:0)

我遇到了类似的问题,并且我相信解决方案是相同的。更正确地说,键盘引起了该问题,键盘触发了WillHideNotification触发器。您在底部具有文本字段,该文本字段可能会侦听有关键盘显示/隐藏的通知,如果您对底部约束进行动画处理,则将触发layoutIfNeeded(),以使键盘不会与文本字段重叠。因此,当您在搜索文本字段中完成搜索时,会在不需要的时间触发keyboardWillHideNotification。我通过致电解决了这个问题:

resignFirstResponder()

表示导致此事件的文本字段。就我而言,那是在您按下按钮后,我相信它在搜索表视图的didSelect tableView单元中。

如果您仍在积极处理此问题,请设法解决此问题。我很想解决这个问题,这很简单明了。

答案 7 :(得分:-1)

  • 在VC2中重新加载表

    之前尝试延迟功能

    DispatchQueue.main.asyncAfter(截止日期:.now()+ 0.1){   tableView.reloadData }

或者

  • 在推送到VC​​2之前,didSelect 中的VC1辞职搜索控制器的第一响应者

  • 在搜索控制器的didSelect 辞职第一响应者中的VC1中,在推送到VC​​2之前设置延迟