这就是我要做的事情。
我有一个UITableViewCell
让我们说固定高度为300(它实际上是一个可变大小的高度,但我试图简化这个例子)
我想要实现的是,当我向后滚动时 - 我会有一个"缩略图"单元格的版本 - 高度为75
我设法让它成功,但现在的问题是,当我向上滚动前一个单元格高度被调整并且滚动位置"跳跃"一旦单元格尺寸变小,导致视图向下跳回#34;当他向上滚动时。
我该如何调整?
代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell;
if (indexPath.row < lastViewedChapter)
{
cell = [self generateChapterCell:tableView indexPath:indexPath collapsed:YES];
}
else
{
cell = [self generateChapterCell:tableView indexPath:indexPath collapsed:NO];
if (indexPath.row > lastViewedChapter)
{
lastViewedChapter = indexPath.row;
}
}
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row < lastViewedChapter)
{
return 73;
}
else
{
return 300; //actually here is a code that calculates the height
}
}
答案 0 :(得分:1)
您是否已降低上部单元格的高度,然后其他单元格向上移动以填充该空间,同时您还在向右滚动?
尝试在更改单元格的高度时设置新的tableView.contentOffset。
在你的情况下,当你将单元格的高度返回为73时,contentOffset.y应该是(old contentOffset.y - (300 - 73))。
我没有对此进行测试,但我认为它可能会有所帮助,您也必须为其他情况计算新的contentOffset(当向下滚动时,表重新加载数据时)。
static NSInteger _lastRow = -1;
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (_lastRow == -1) {
_lastRow = indexPath.row;
return 300;
} else {
if (_lastRow > indexPath.row) {
_lastRow = indexPath.row;
if ([tableView rectForRowAtIndexPath:indexPath].size.height == 300) {
[tableView setContentOffset:CGPointMake(tableView.contentOffset.x, (tableView.contentOffset.y - (300 - 73)))];
}
return 73;
} else {
_lastRow = indexPath.row;
return 300;
}
}
}
这段代码工作正常,但仍然有一些错误(第一行加载数据时的第一行高度就像你向上滚动一次,当你向上滚动到顶部时它不能正常反弹)但我希望这可以帮助你
答案 1 :(得分:0)
由于您已经更改了单元格高度,因此肯定会发生这种情况。
问题是如何缓解这种糟糕的用户体验。
UITableView
是UIScrollView
的子类。 UIScrollViews
也提供了UITableView类中可用的委托。
执行以下操作。
self.tableView.delegate = self;
然后实现以下功能。在下文中,location是您标头中定义的CGPoint
变量。
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
location = tableView.contentOffset;
}
-(void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
CGPoint newLocation = tableView.contentOffset;
if (CGPointEqualToPoint(location, newLocation))
{
NSLog(@"are equal");
tableView.contentOffset = CGPointMake(location.x, location.y-227);
}
}