【问题标题】:Observe current contentOffset during UiTableView's delete rows animation在 UiTableView 的删除行动画期间观察当前 contentOffset
【发布时间】:2020-05-17 05:42:37
【问题描述】:

我根据 tableView 的内容偏移设置 UI 行为。它在所有情况下都能正常运行,除了一种情况:当 tableView 开始删除带有动画的行时。

问题是在删除前有很多内容,用户滚动了其中的一部分,但删除tableView后可以显示整个内容而无需滚动。在这种情况下,表格视图会在删除动画的同时平滑地更改内容偏移量。

造成我的问题的主要原因是在删除动画期间没有调用scrollView委托的方法scrollViewDidScroll,我的行为不起作用。

我尝试使用 KVO 来观察偏移变化:

observation = tableView.observe(\.contentOffset, options: [.new, .old]) { (_, change) in
    print(change)
}

它工作得更好,但在第一时刻只触发一次并带有最终值,所以我没有收到任何中间值,我需要做出平滑的 UI 反应。

好的,我尝试使用 UIView.animate 和兄弟姐妹为我的行为设置动画。但是发现我的动画和tableview的偏移动画很难选择参数来同步。

那么,我错过了什么?在行删除动画期间是否可以观察到任何中间偏移值?

【问题讨论】:

    标签: ios uitableview contentoffset


    【解决方案1】:

    好的,伙计!我有一条好消息要告诉你 =] 你可以使用 Layer Presentation Tree 来观察每一刻的 UI 值。

    1. 将 tableView 更新包装到 CATransaction 中
        let displayLink = CADisplayLink(target: self, selector: #selector(adjustHeader))
        displayLink.add(to: .current, forMode: .common)
    
        CATransaction.begin()
        CATransaction.setCompletionBlock(displayLink.invalidate)
        // do tableView updates here
        CATransaction.commit()
    
    
    1. 使用层表示树计算当前偏移量。例如:
    @objc private func adjustHeader() {
        guard
            let headerPresentationLayer = headerView.layer.presentation(),
            let viewPresentationLayer = view.layer.presentation(),
            let tableViewPresentationLayer = tableView.layer.presentation()
            else { return }
    
        let origin = tableViewPresentationLayer.convert(headerPresentationLayer.frame.origin, to: viewPresentationLayer)
        print("LayerPresentationTree: \(origin)")
        offsetDepandableView.frame.origin = origin
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      相关资源
      最近更新 更多