向上滚动时,iOS UITableView滚动位置会跳转

时间:2015-03-31 07:40:18

标签: ios uitableview

这就是我要做的事情。 我有一个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
    }
}

2 个答案:

答案 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)

由于您已经更改了单元格高度,因此肯定会发生这种情况。

问题是如何缓解这种糟糕的用户体验。

UITableViewUIScrollView的子类。 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);
    }
}