JK *_*iho 7 objective-c reusability uitableview ios heightforrowatindexpath
我正在构建一个具有可变高度自定义表格单元格的UITableView,它们的高度由包含的多行UILabel的大小决定.我已经将tableView:heightForRowAtIndexPath:
委托方法连接起来并使用正确计算最终高度sizeWithFont:constrainedToSize:
.
我遇到了一个奇怪的问题:在tableView:cellForRowAtIndexPath:
调用数据源方法时,已经如上所述确定了正确的每行高度,但是单元格的框架与该高度不匹配.相反,frame.size.height
单元格的属性是表格视图的默认单元格高度(86 px,因为我在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
Run Code Online (Sandbox Code Playgroud)
那么,无论iOS在幕后做什么,出列都不是设置单元格的frame属性来匹配计算出的高度.这本身就不那么令人惊讶,因为细胞实例而不是它们的几何体而引起了人们的关注.但是,单元格正确呈现,因此高度属性正在某处设置,但它会在之后发生cellForRowAtIndexPath:
.
所以:当我最初填充表格视图时,cell.frame.size.height
当我向下滚动列表时,第一次出现的所有单元格都是86.由于在cellForRowAtIndexPath:
显示之前的每一行之后的某个时间设置了正确的几何体,所以当我向上滚动时,高度属性对于重新使用后返回视图的每个单元格都是正确的.
在此之后,我可以随意来回滚动表格视图,并且从该点开始,每个单元格的高度属性保持正确.
在任何基于出队的重用发生之前,第一次获得正确的单元高度的正确方法是什么?我需要这个来重新定位表格单元格的子视图.我是否需要手动调用heightForRowAtIndexPath:
中cellForRowAtIndexPath:
,然后手动设置新创建CustomCell实例的框架相匹配的高度?这似乎是多余的,我需要创建一种机制来检测第一次使用错误的帧高度创建单元格的时间,以及稍后使用正确的帧高度进行出列以避免此冗余.
所以,如果有人能够了解这背后的逻辑,我会很感激.
正如Flexo所建议的那样,自己回答这个问题显然比在问题中添加编辑更好.所以,这是以前的编辑作为答案:
没关系,我应该更好地阅读文档.我可以在tableView:willDisplayCell:forRowAtIndexPath:
方法中获得正确的框架UITableViewDelegate
,因此这是进行依赖于设置的正确框架的子视图自定义的正确位置,而不是cellForRowAtIndexPath:
.
有趣的是,文档说这个,但是:
在后
delegate
返回,表视图只设置alpha
和frame
动画的行,只有当他们在或滑出属性,然后.
...因为在调用此委托方法时,正确的帧已存在.但无论如何,问题解决了.
归档时间: |
|
查看次数: |
4285 次 |
最近记录: |