首页 文章

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

提问于
浏览
7

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

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

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

enter image description here

问题是,当用户激活搜索控制器,找到一些聊天并点击它时,包含表视图的推送视图控制器与聊天消息确实有些奇怪 animation with the table view that should not happen

enter image description here

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

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

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

7 回答

  • 4

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

    我不打算进一步调查,因为自iOS11以来,安全区管理存在一个深奥的问题 . 一个bug? :)

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

  • 0

    如果您在推送新的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)
    
  • 0

    您可以尝试在出列并设置单元格内容后立即调用 cell.layoutIfNeeded()

  • 0

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

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

    不要在 viewDidLoadviewWillAppear 中调用 reloadData() 方法 . 而不是在 viewDidLoad 中使用空数据重新加载tableView,这样你的 tableView 将不显示任何内容,然后在 viewDidAppear 调用 reloadData() 方法中加载所有聊天 . 这将限制您的tableView加载不需要的动画 .

    var shouldShowEmpty = true
    
    func viewDidLoad() {
        super.viewDidLoad()
        tableView.reloadData()
    }
    func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        shouldShowEmpty = false
        tableView.reloadData()
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            if shouldShowEmpty {
                return 0
            }
            return yourArray.count
        }
    
  • 0

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

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

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

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

  • 0
    • 在VC2中重新加载表之前尝试延迟功能

    DispatchQueue.main.asyncAfter(截止日期:.now()0.1)

    要不然

    • 在推送到VC2之前的搜索控制器的 didSelect resign first responder 中的VC1中

    要么

    • 在搜索控制器的 didSelect resign first responder 中的VC1中,在推送到VC2之前设置 delay .

相关问题