2015-09-02 65 views
8

我有一个表视图,其中包含一个占位符,而它在图像中加载。当图像加载时,我打电话给reloadRowsAtIndexPaths:withRowAnimation:。此时,单元根据图像的大小更改高度。当发生这种情况时,我希望表格视图的内容偏移保持原状,并且可以像下面这样将单元格向下推进。UITableView滚动到顶部重新加载单元格时更改单元格高度

我得到的效果是滚动视图滚动回顶部。我不确定这是为什么,我似乎无法阻止它。在reloadRows行之后beginUpdates()之前和endUpdates()不起作用。

我使用的是estimatedRowHeight,因为我的表格视图可能有数百行不同高度的行。我也在实施tableView:heightForRowAtIndexPath:

编辑:我已经设置了一个演示项目来测试这一点,并承认我无法获得演示项目来重现此效果。我会继续努力。

+0

你可以发布你的代码来获取tableview的内容偏移量,并设置你希望tableview的焦点保留在哪里吗? –

回答

11

总是更新主线程上的用户界面。所以只需将

[self.tableView reloadData]; 

主线程中:

dispatch_async(dispatch_get_main_queue(), ^{ 
    //UI Updating code here. 
    [self.tableView reloadData]; 
}); 
27

这是估计的RowHeight的问题。

EstimatedRowHeight与实际高度的差距越大,表格在重新加载时可能跳跃得越多,尤其是在进一步向下滚动时。这是因为表格的估计尺寸与其实际尺寸完全不同,迫使表格调整其内容尺寸和偏移量。

最简单的解决方法是使用真正准确的估计值。如果每行的高度变化很大,则确定一行的中位高度,并将其用作估计值。

+0

在我的测试中,我尝试了一个非常小的估计值和一个非常大的估计值,但都没有不必要的滚动效果。 – Andrew

+0

这是一个很好的答案。谢谢。估计的高度不应该是一个随机数,而应该接近你认为的高度。 – darwindeeds

+0

谢谢你,那是我的原因。以坏的方式,虽然这种方式虽然... – warly

6

我有同样的问题,并通过这种方式决定它:保存细胞的高度它们加载时和tableView:estimatedHeightForRowAtIndexPath给出确切值:

// declare cellHeightsDictionary 
NSMutableDictionary *cellHeightsDictionary; 

// save height 
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    [cellHeightsDictionary setObject:@(cell.frame.size.height) forKey:indexPath]; 
} 

// give exact height value 
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSNumber *height = [cellHeightsDictionary objectForKey:indexPath]; 
    if (height) return height.doubleValue; 
    return UITableViewAutomaticDimension; 
} 
+0

在我的例子中,我在超类中有'self.tableView.estimatedRowHeight = 44;'。在当前课程中将其设置为零,在那里我固定行高度解决了问题。 –

0

我看到了这个,对我而言,修复工作就是选择估计的行高,这是可能行中最小的行数。当意外滚动发生时,它最初被设置为尽可能最大的行高。我只是使用单个tableView.estimatedRowHeight属性,而不是委托方法。

相关问题