【问题标题】:How can I stop UITable from overriding the content offset I set when it is decelerating?如何阻止 UITable 覆盖我在减速时设置的内容偏移量?
【发布时间】:2011-10-24 16:12:46
【问题描述】:

我有一张桌子,我正在为它做一些特殊的加载。用户开始滚动到底部。当用户在顶部附近滚动时,我通过滚动视图委托方法检测到这一点,然后我快速加载一些额外的内容,并填充列表顶部的更多内容。我希望它看起来无缝,就像向上的“无限滚动”。为此,我必须设置内容偏移量,以便用户不会看到表格向上“跳跃”。当我慢慢滚动时,这非常有效。当我快速滚动以使表格减速时,我设置的内容偏移量将被忽略。这是我正在使用的代码:

CGFloat oldHeight = self.tableView.contentSize.height;
CGFloat oldOffset = self.tableView.contentOffset.y;
self.tableContentsArray = newTableContentsArray;
[self.tableView reloadData];
CGFloat newHeight = self.tableView.contentSize.height;
CGFloat newOffset = oldOffset + (newHeight - oldHeight);
self.tableView.contentOffset = CGPointMake(0, newOffset);

因此,如果我使用 100 像素高的表格快速向上滚动并在减速时到达顶部,我会加载更多数据,获得一个新的表格高度,例如 250 像素。我将偏移量设置为 150。但是,由于它仍在减速,Apple 代码将偏移量设置为 150 0.1 秒或其他时间,然后转到下一个计算的减速偏移量,并将偏移量设置为 0,这使得它在用户看来,他们只是跳过了 150 像素的内容,现在位于列表的新顶部。

现在我希望保持列表中的加速度,这样它会继续上升一段时间,然后减速,并最终达到大约 120 像素的偏移量,就像您所期望的那样。问题是,怎么做?

如果我使用[self.tableView setContentOffset: CGPointMake(0, newOffset) animated: NO];,它会阻止内容偏移被忽略,但会阻止列表失效。

【问题讨论】:

    标签: iphone ios uitableview


    【解决方案1】:

    几个月前,我们在工作中遇到了这样一个有趣的情况。我们想使用 UITableViewController 因为它具有缓存、加载和动画功能,但我们希望它水平滚动(在您的情况下它将向上滚动)。解决方案?旋转表格,然后向另一个方向旋转单元格。

    在您的情况下,代码如下所示:

    #define degreesToRadian(x) (M_PI * (x) / 180.0) 在标题中

    - (void) viewDidLoad {
       [super viewDidLoad];
       self.table.transform = CGAffineTransformMakeRotation(degreesToRadian(-180));
       ...
    }
    

    然后旋转单元格,使其以正确的方向显示给用户

    - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        ...
        cell.transform = CGAffineTransformMakeRotation(degreesToRadian(180));
    }
    

    现在您可以像任何普通表格一样后置单元格,它们将被添加到顶部而不是底部。

    【讨论】:

    • 非常酷的解决方案!它基本上是在破解 UITableView,但根据我对 iOS 的经验,我可以说你总是要破解一些东西 :)
    【解决方案2】:

    恐怕你在没有真正理解的情况下试图做太复杂的事情。

    你真的有一张无限大的桌子或一张很长的桌子吗?我认为可以只告诉表格它有 1000000 个单元格。每个单元格在您需要时加载。这基本上就是你想要做的。

    【讨论】:

    • 数据来自昂贵的数据库查询,我需要分块加载。每个单元格都有一个基于数据的自定义高度。这使得建议的解决方案不可行。
    • 当所有行的高度相同时,UITable 具有最佳性能(以及最佳外观和感觉)。重新考虑你的 UI 或者完全离开 UITableView 不是更好吗?无论如何,如果 DB 查询过于昂贵,您无法在没有暂停的情况下滚动表格,您将不得不添加一些加载指示器。我们在我们的项目中正是这样做的——我们的最后一个单元格内部只有进度指示器,当从服务器加载新数据时,我们删除单元格并添加带有新数据的单元格。但是,这只有在您的加载单元位于底部时才有效。
    猜你喜欢
    • 2013-04-21
    • 2011-04-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    相关资源
    最近更新 更多