的UITableViewCell框高度不匹配的tableView:heightForRowAtInd

2019-06-26 22:59发布

我建设有可变高度定制表格单元,通过包含多行的UILabel的大小来确定它们的高度一个UITableView。 我已经得到了tableView:heightForRowAtIndexPath:委托方法有线和使用正确计算最终高度sizeWithFont:constrainedToSize:

我经历了奇怪的问题,借着当时的数据源方法tableView:cellForRowAtIndexPath:被调用时,正确的每行高度已经如上所述确定,但细胞的帧高度不匹配。 相反, frame.size.height细胞的属性是表视图的默认单元格高度(86像素,因为我已经将它设置在Interface Builder中,当所包含的UILabel有文字只有一行正确的高度),而不是被高度tableView:heightForRowAtIndexPath:确定该索引路径是正确的。

我产生的细胞cellForRowAtIndexPath:使用出列,也就是说,

// Using storyboards, this never returns nil, no need to check for it
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"SomeIdentifier"];
NSLog(@"%f", cell.frame.size.height); // 86, not correct if the cell contains a multi-line UILabel

那么看来,无论是iOS的是做幕后,离队不设置单元格的边框属性以匹配计算高度。 这本身并不奇怪,出列关注的是电池的情况下,不是他们的几何形状。 细胞被正确地呈现,不过,这样的高度属性被设置的地方 ,但它之后会发生cellForRowAtIndexPath:

所以说:当我最初填充表视图, cell.frame.size.height是所有细胞86,因为它们出现在第一次时,我向下滚动列表。 由于正确的几何形状是第一之后的某个设定cellForRowAtIndexPath:每一行之前它显示的,当我向后滚动起来,高度属性是自带回到视图中被重用后,每个单元正确的。

在此之后,我可以随意滚动表视图来回,和height属性仍然是从这一点上来说每个单元正确的。

什么是围绕得到正确的单元格高度在第一时间,任何基于出列重用发生之前的正确方法是什么? 我需要这个做一些表格单元格的子视图的重新定位。 我是否需要手动调用heightForRowAtIndexPath:cellForRowAtIndexPath:然后手动设置新创建CustomCell实例的框架相匹配的高度? 这似乎是多余的,而且我需要建立一个机制,当第一次与错误帧的高度与创建细胞,当它与正确的帧高度离队后,以避免这种冗余检测。

所以,如果有人可以提供一些线索到逻辑的背后是这算什么,我将不胜感激。

Answer 1:

正如柔印建议,回答这个我显然不是增加一个编辑的问题更好。 所以,这里是以前的编辑作为一个答案:


没关系,我应该更好地阅读文档。 我可以在正确的帧tableView:willDisplayCell:forRowAtIndexPath:方法UITableViewDelegate ,这样是做子视图定制依赖正确的帧上被设置,不正确的地方cellForRowAtIndexPath:

有趣的是,文档说这一点,虽然:

在后delegate返回,表视图只设置alphaframe动画行,只有当他们在或滑出属性,然后。

......因为正确的框架已经存在时,此委托方法被调用。 但无论如何,问题就迎刃而解了。



Answer 2:

不要忘记,电池是一个UIView ,所以首要的layoutSubviews也得到了正确的框架和调整子视图大小/位置的有效方法。 只是不要忘记调用[super layoutSubviews]



Answer 3:

我发现最简单的方法是只为了呼唤cell.layoutIfNeeded()你做的任何单元格设置之前。 这可以确保所有的布局约束计算和帧设置。



文章来源: UITableViewCell frame height not matching tableView:heightForRowAtIndexPath: