我有一张桌子,我正在做一些特殊的装载。用户开始滚动到底部。当用户在顶部附近滚动时,我通过滚动视图委托方法检测到这一点,并且我快速加载一些其他内容,并填充更多列表的顶部。我希望这看起来无缝,就像向上的“无限卷轴”。要做到这一点,我必须设置内容偏移量,以便用户不会看到表“向上跳”。当我慢慢滚动时,这很有效。当我快速滚动,以便表格减速时,忽略我设置的内容偏移量。这是我正在使用的代码:
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);
因此,如果我使用100px高的表快速向上滚动并在减速时击中顶部,我会加载更多数据,获得新的表高度,例如250px。我将偏移设置为150.但是,由于它仍然在减速,Apple代码将偏移设置为150,持续0.1秒或者其他,然后转到下一个计算的减速偏移,并将偏移设置为0,这使得向用户表示他们只是跳过150px的内容,现在位于列表的新顶部。
现在我喜欢保持列表中的加速度,以便它持续上升一段时间,减速,最终在120px偏移量附近,就像你期望的那样。问题是,如何?
如果我使用[self.tableView setContentOffset: CGPointMake(0, newOffset) animated: NO];
,它会阻止内容偏移被忽略,但会使列表停止运行。
答案 0 :(得分:2)
几个月前我们在工作中遇到了这样一个有趣的情况。我们想使用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));
}
现在你可以将你的细胞像任何普通的桌子一样张贴,它们将被添加到顶部而不是底部。
答案 1 :(得分:0)
我担心你在没有真正理解它们的情况下做太复杂的事情。
你真的有一张桌子还是一张很长的桌子?我想有可能只告诉它有1000000个单元格。每个单元格在您需要时加载。这基本上就是你想要做的。