首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >永恒滚动UITableView

永恒滚动UITableView
EN

Stack Overflow用户
提问于 2011-09-20 15:02:10
回答 5查看 2.9K关注 0票数 9

我正在尝试创建一个带有日期的UITableView,应该不是很令人兴奋,我知道。它大约在当前日期开始,但用户应该能够向下滚动(未来)和向上(过去)到他/她想要的程度。这将导致潜在的无限行数。那么创造这个的方法是什么呢?

返回NSIntegerMax作为已经崩溃的应用程序的行数,但即使没有,这仍然不能解释为什么能够向上滚动。当然,我可以从一半开始,但最终还是会有一个最大值。

你知道怎么做还是假的吗?我是否可以在用户注意到的情况下以某种方式更新/重新加载表,这样我就不会碰到边框了?

解决方案:

我接受了@ender的建议,用固定数量的细胞做了一张桌子。但是,当用户滚动到固定单元格的边缘时,我没有重新加载它,而是在滚动开始停止时重新加载表。为了适应用户在不停止的情况下滚动很远的距离,我只是将行数增加到1000,将ROW_CENTER常量增加到500。这是负责更新行的方法。

代码语言:javascript
复制
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    NSArray *visible = [self.tableView indexPathsForVisibleRows];
    NSIndexPath *upper = [visible objectAtIndex:0];
    NSIndexPath *lower = [visible lastObject];

    // adjust the table to compensate for the up- or downward scrolling
    NSInteger upperDiff = ROW_CENTER - upper.row;
    NSInteger lowerDiff = lower.row - ROW_CENTER;

    // the greater difference marks the direction we need to compensate
    NSInteger magnitude = (lowerDiff > upperDiff) ? lowerDiff : -upperDiff;

    self.offset += magnitude;
    CGFloat height = [self tableView:self.tableView heightForRowAtIndexPath:lower];
    CGPoint current = self.tableView.contentOffset;
    current.y -= magnitude * height;
    [self.tableView setContentOffset:current animated:NO];

    NSIndexPath *selection = [self.tableView indexPathForSelectedRow];
    [self.tableView reloadData];
    if (selection)
    {
        // reselect a prior selected cell after the reload.
        selection = [NSIndexPath indexPathForRow:selection.row - magnitude inSection:selection.section];
        [self.tableView selectRowAtIndexPath:selection animated:NO scrollPosition:UITableViewScrollPositionNone];
    }
}

当用户在没有停止的情况下滚动到表的边缘,但是由于禁用了表视图bounces属性,这只会让人觉得这只是一个小故障,但完全可以接受。一如既往,谢谢StackOverflow!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-20 15:10:39

当用户在表视图的末尾滚动时,您应该建立固定数量的单元格,并调整数据源。例如,您有一个具有51个日期的数组(今天、25个未来和25个过去)。当应用程序试图在其中一个边框附近呈现单元格时,重新配置数组并调用reloadData

票数 5
EN

Stack Overflow用户

发布于 2011-09-21 09:04:35

你也可以看看WWDC 2011的“高级涡旋视图技术”。他们展示了如何创建一个无限期滚动的UIScrollView。大约5分钟开始。在……里面。

票数 3
EN

Stack Overflow用户

发布于 2011-09-20 19:37:04

有两个想法:

  1. 你真的需要UITableView吗?您可以使用一个UIScrollView,三个屏幕高。如果到达滚动结束,则布局内容并调整滚动位置。这就产生了无限滚动的错觉。创建一些日期标签并将其放置在layoutSubviews:中不应该太费劲。
  2. 如果真的想坚持使用UITableView,可以考虑使用两个UITableViews。如果在第一个线程中滚动到临界点,则拆分一个线程并填充第二个线程。然后,在某个时候,交换视图并手动触发滚动,这样用户就不会注意到更改。这只是我头上的一些想法。我还没有实现类似的东西,但是我实现了无限的UIScrollView.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7487352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档