UITableViewCell的contentView在heightForRowAtIndexPath中调用时宽度不同:

Posted

技术标签:

【中文标题】UITableViewCell的contentView在heightForRowAtIndexPath中调用时宽度不同:【英文标题】:UITableViewCell's contentView has different width when calling in heightForRowAtIndexPath: 【发布时间】:2014-10-30 13:00:14 【问题描述】:

我正在尝试计算使用自动布局进行布局的表格视图单元格的高度。由于这也必须与 ios7 兼容,因此我需要为 heightForRowAtIndexPath: 返回一个有效高度。

我正在做的事情如下:

if (self.userRatingsAbbreviatedTextCell == nil) 
    self.userRatingsAbbreviatedTextCell = [[UserRatingsAbbreviatedTextCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

[self.userRatingsAbbreviatedTextCell prepareForReuse];
UserRating *rating = [self.paginationModel ratingAtIndex:reviewIndex];
[self.userRatingsAbbreviatedTextCell configureCellForHotelUserRating:rating];
[self.userRatingsAbbreviatedTextCell layoutIfNeeded];

CGSize size = [self.userRatingsAbbreviatedTextCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size.height;

该单元格有一个披露指示符。当我询问单元格的contentView 宽度时,它是296。然而在cellForRowAtIndexPath: 中,在出列单元格后,其contentView 宽度为289,这是用于渲染的大小。有没有人遇到过这样的问题?我需要做什么才能让单元格正确设置其contentView 宽度?

【问题讨论】:

如果表格是静态的,您可以从super获取高度 但它仍然损坏......我对此进行了更多调查,发现在表格视图上调用 _configureCellForDisplay:forIndexPath: 并将其传递给单元格会将内容视图的大小调整为正确的大小,但是因为这是私有 API,所以不能解决问题... 你已经看过了吗? ***.com/questions/18746929/… 是的,这是我们进行单元格布局的方式,但是一旦有显示指示器或类似的附件视图,iOS7 兼容方式就不再适用于 iOS8。 我没有得到你的答案,究竟是什么坏了,视图调试的结果是什么? 【参考方案1】:

我对@9​​87654323@ 的大小与UITableViewCell 不同的解决方案。可能会破坏UITableViewCell 的一些固有属性,例如附件视图。

在您的单元格类中覆盖 UITableViewCelllayoutSubviews 方法:

- (void)layoutSubviews

    [super layoutSubviews];

    // force `contentView` to be the same size as `self` (it's typically 0.5pt smaller)
    CGRect contentViewFrame = self.contentView.frame;
    contentViewFrame.size = CGSizeMake(CGRectGetWidth(self.frame), CGRectGetHeight(self.frame));
    self.contentView.frame = contentViewFrame;

在我的例子中,contentView 总是更小0.5 点,并且在计算tableView:heightForRowAtIndexPath: 的正确高度时会导致问题。我会计算不会导致UILabel 换行的单元格的完美高度,但它总是会切断最后一行,因为高度太小了0.5 点。

我的手机,供参考:

【讨论】:

以上是关于UITableViewCell的contentView在heightForRowAtIndexPath中调用时宽度不同:的主要内容,如果未能解决你的问题,请参考以下文章

iPhone X 上的 UITableViewCell contentView inset

iOS 8:UITableViewCell.contentView 不会调整其中的子视图大小

在 iOS 13 中处理已更改的 AccessoryType 大小

突出显示的 UITableViewCell 和选定的 UITableViewCell 有啥区别?

UITableViewCell 中的 UIDatePicker 更新 UITableViewCell 文本标签

Popover箭头与viewcontroller背景颜色不同