代码之家  ›  专栏  ›  技术社区  ›  Chen Li Yong

为什么uitableview contentoffset在tableview重新加载数据期间变化很大,而不是保持不变?如何使它在重新加载数据后保持不变?

  •  -1
  • Chen Li Yong  · 技术社区  · 6 年前

    我在上网,但没有令人满意的结果。我有一个 tableView ,每当我这样做时,它的偏移量总是不稳定地变化 reloadData . 即使表的内容保持不变,也会发生这种情况。

    我放了一个代码来记录运行时偏移量的变化 重新加载数据 使用 scrollViewDidScroll .

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        print ("TABLEVIEW OFFSET : \(scrollView.contentOffset)");
    }
    

    我还创建了一个代码来保存重新加载数据之前的旧偏移量,并在延迟之后重新设置为新偏移量。

    extension UITableView {
    
        func reloadDataOffset() {
            print ("OLD OFFSET : \(self.contentOffset)");
            let offset = self.contentOffset;
            let oldHidden = self.isHidden;
            self.isHidden = true;
            self.reloadData();
            delay(1) {
                self.setContentOffset(offset, animated: false);
                self.isHidden = oldHidden;
                print ("NEW OFFSET : \(self.contentOffset)");
            }
        }
    
    }
    

    这就是日志上显示的内容。

    OLD OFFSET : (0.0, 314.0)
    TABLEVIEW OFFSET : (0.0, -64.0)
    TABLEVIEW OFFSET : (0.0, 314.0)
    TABLEVIEW OFFSET : (0.0, -64.0)
    TABLEVIEW OFFSET : (0.0, 753.0)
    TABLEVIEW OFFSET : (0.0, 586.0)
    TABLEVIEW OFFSET : (0.0, 753.0)
    TABLEVIEW OFFSET : (0.0, 706.0)
    TABLEVIEW OFFSET : (0.0, 753.0)
    TABLEVIEW OFFSET : (0.0, 751.5)
    TABLEVIEW OFFSET : (0.0, 750.0)
    TABLEVIEW OFFSET : (0.0, 747.5)
    TABLEVIEW OFFSET : (0.0, 744.5)
    TABLEVIEW OFFSET : (0.0, 741.0)
    TABLEVIEW OFFSET : (0.0, 737.5)
    TABLEVIEW OFFSET : (0.0, 733.5)
    TABLEVIEW OFFSET : (0.0, 729.5)
    TABLEVIEW OFFSET : (0.0, 725.5)
    TABLEVIEW OFFSET : (0.0, 721.5)
    TABLEVIEW OFFSET : (0.0, 717.5)
    TABLEVIEW OFFSET : (0.0, 714.5)
    TABLEVIEW OFFSET : (0.0, 711.5)
    TABLEVIEW OFFSET : (0.0, 709.0)
    TABLEVIEW OFFSET : (0.0, 707.5)
    TABLEVIEW OFFSET : (0.0, 706.5)
    TABLEVIEW OFFSET : (0.0, 706.0)
    TABLEVIEW OFFSET : (0.0, 314.0)
    NEW OFFSET : (0.0, 314.0)
    

    我这样做(添加延迟)是因为我在某个地方看到tableview重载数据发生在不同的线程中,并且每当重载数据完成时,我不能确切地得到回调或通知。但这看起来很难看。我可以移除 isHidden = true 部分,但这会使表内容看起来跳跃。有没有什么真正的方法可以在重载数据完成后立即将偏移量重新设置为旧值?或者,有什么方法可以使滚动偏移在重新加载数据之前/之后保持不变?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Chen Li Yong    6 年前

    我打电话进来后终于修好了 viewDidLoad() :

    tableView.estimatedRowHeight = 0;
    tableView.estimatedSectionHeaderHeight = 0;
    tableView.estimatedSectionFooterHeight = 0;
    

    看起来这是ios 11的一个新的默认“模糊特性”,在我看来,它带来的损害远大于帮助。这就是为什么在ios 11之前我从未遇到过这个问题。这个估计值弄乱了我的表内容大小和内容偏移量控件。试着关掉这三个估计,你就会看到 UITableView 不稳定的 contentOffset contentSize 会在你的控制下再次行动。我真的很希望苹果在添加这些功能时将其默认设置为禁用,以避免处理那些没有准备好进行新更改的旧代码。