UITableViewCellContentView高度与heightForRowAtIndexPath的高度有何不同:

我在UITableView上遇到了一个非常奇怪的问题。 我有一些不同的单元格,我想在类似新闻源的表视图上显示。

重用后我的单元格有问题。 单元格包含两个图像,两个标签和一个带共享/喜欢/注释按钮的视图。 我会尝试绘制它,但我不确定它会漂亮:

------------------------------------------------- | | __ ____________________________ | | | |_2| | | | | | | 3 | | | | | | | | 1 | |____________________________| | | | | | |_______________________________________| | | | | | 4 | |_______|_______________________________________| | | | 5 | |_______________________________________________| 1 : objectImage 2 : subjectImage 3 : titleLabel 4 : commentLabel 5 : actionsView 

我的约束是:

 "H:|-0-[objectImage(60)]-7-[subjectImage(30)]-7-[titleLabel]-7-|" "H:|-0-[objectImage(60)]-0-[commentLabel]-0-|" "H:|-0-[actionsView]-0-|" "V:|-0-[objectImage(>=35)]-0-[actionsView(44)]-0-|" "V:|-7-[subjectImage(30)]" "V:|-7-[titleLabel(>=46)]-7-[commentLabel(>=35)]-0-[actionsView(44)]-0-|" 

每次绘制单元格时,我都会更改此约束:

 "V:[commentLabel(%0.2f)]" 

细胞第一次完美显示。

但是,我遇到的问题是,在某些时候,经过一些重用(我不能每次都重现它),应用程序因为一个约束问题而崩溃。 这是例外:

 "", "", "", "", "=46)]>", "", "", "" Will attempt to recover by breaking constraint  

问题是约束[UITableViewCellContentView:0x1ef2bf50(147)]不正确。

奇怪的是,heightForRowAtIndexPath:返回正确的值217。

而我不明白的是UITableViewCell的高度是正确的!

 (lldb) po 0x1ef2bf50 $0 = 519225168 <UITableViewCellContentView: 0x1ef2bf50; frame = (0 0; 320 147); gestureRecognizers = ; layer = > (lldb) po [0x1ef2bf50 superview] $1 = 0x1ef30e40 <NewsSubjectCommentCell: 0x1ef30e40; baseClass = UITableViewCell; frame = (0 1055; 320 217); hidden = YES; autoresize = W; layer = > 

所以我不明白UITableViewCellContentView的高度约束怎么可能是147.它是同一类型的另一个单元格的高度,但它应该更改为209,对吧?

所以,如果你对如何发生这种情况有任何见解(也许我做错了什么),我会很高兴的。

谢谢,

我在这里找到了答案: UITableViewCell上iOS7上的自动布局限制问题

我们只需要将contentView的AutoresizingMask设置为UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth和…问题解决了!

您可以尝试将(/某些)高度设置为较低的优先级(例如@ 900)。 我有一个类似的问题(我的UITableViewCellContentView太小,无法满足约束)。 在我降低了我的“错误”高度的优先级之后,它在预期的高度上很好地布置。

如果使用代码或可视语言添加约束,则必须关闭包含约束的视图的自动调整转换:

  [self.someView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

这可以防止创建[UITableViewCellContentView:0x1ef2bf50(147)]约束。

在cellForRowAtIndexPath中,您从tableview请求一个单元格。 您获得的单元格将是新创建的单元格(大小为320,44)或已出列的单元格并发送prepareForReuse消息(具有之前的大小)。 当您将代码NSLayoutConstraints应用于contentView时,它们将单元格适合所提供的tableview空间之前解析。 这没有任何意义,但绝对是我观察的结论。

因此,在我的实例中,我获得了44个高度的新单元格,但我的一个约束是48的固定高度。这是不断抛出exception并使调试变得痛苦。 我所做的只是让exception消失的是当我在cellForRowAtIndexPath中准备它时,将单元格的框架设置为正确的高度(宽度我认为,如果你遇到水平维度上的问题)。

 UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:CellIdentifier]; if(cell==nil) cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; // If the cell is new its frame will be (0,0,320,44) cell.frame = CGRectMake(0,0,tableview.frame.size.width,calculatedHeightRequiredForLayout); [cell.contentView addConstraints:constraints]; 

在显示在tableview中之前,单元格会自动将其自身调整为正确的尺寸,这样您就不会出现任何问题,但是您的布局限制将被应用而不需要被iOS“打破”……