在不知道高度的情况下在单元格内下载异步图像

时间:2016-01-26 16:21:07

标签: ios objective-c uitableview autolayout objective-c-blocks

我正面临这个问题而且我一直试图弄清楚如何修复它但却没有成功。 我有一个表格视图,其中包含一个图像,我仍然不知道哪个高度。我创建了一个出口到imageView的高度约束,我用PinRemoteImage异步下载图像(我也可以使用SDWebImage,但我认为它在iOS 9中有问题)。在块内部是我为高度约束分配新常量然后我进行布局更新。 单元格永远不会更新,我能正确看到图像的唯一方法是向下滚动然后向上(当tableview重新绘制单元格时)

__weak typeof(UITableView*) weakTable = tableView;
__weak typeof(NSIndexPath*) index = indexPath;

[cell.commentImageView pin_setImageFromURL:[[CTImageHelper sharedInstance] resizedImageURLConverterFromStringWithPrefix:comment.image.completePath andOptions:optionsString] completion:^(PINRemoteImageManagerResult *result) {
   CommentTableViewCell *cellToUpdate = [weakTable cellForRowAtIndexPath:index];
   cellToUpdate.heightSize = [NSNumber numberWithFloat:result.image.size.height/2];
   cellToUpdate.commentImageViewHeightConstraint.constant = result.image.size.height/2;
        [cellToUpdate setNeedsLayout];
}];

这是自动设置表格视图行高的代码

self.postTableView.estimatedRowHeight = 244.0;
self.postTableView.rowHeight = UITableViewAutomaticDimension;

关于细胞限制的图像: enter image description here

关于我做错什么的任何想法?谢谢!

3 个答案:

答案 0 :(得分:2)

layoutIfNeeded放在setNeedsLayout

之后
 [cellToUpdate setNeedsLayout];
 [cellToUpdate layoutIfNeeded];

 // and then tell the tableView to update.
 [weakTable beginUpdates];
 [weakTable endUpdates];
 // then scroll to the current indexPath
 [weakTable scrollToRowAtIndexPath:indexPath 
                 atScrollPosition:UITableViewScrollPositionNone 
                         animated:NO]; 
如果一次多次调用,

更新 [weakTable beginUpdates];[weakTable endUpdates];可能会崩溃。你需要确保它们之间没有切割。

您也可以尝试重新加载单元格本身。

 [cellToUpdate setNeedsLayout];
 [cellToUpdate layoutIfNeeded];
 [weakTable reloadRowsAtIndexPaths:[indexPath] withRowAnimation:UITableViewRowAnimationNone];

答案 1 :(得分:1)

您应在致电layoutIfNeeded后致电setNeedsLayout以实际触发布局。

答案 2 :(得分:1)

除了setNeedsLayoutlayoutIfNeeded之外,你需要通过触发空更新来告诉tableview它的单元格的高度发生了变化:

[tableView beginUpdates];
[tableView endUpdates];