【发布时间】:2012-04-20 01:25:53
【问题描述】:
我的问题基本上归结为在 UITableCell 中支持 UILabel(我想是其他元素)的动态高度的最佳方法,以及正确调整标签宽度/高度和单元格的大小旋转时的高度。
我知道如何获得 UILabel 的预期高度,并相应地调整高度,但是当你也支持横向时,事情似乎变得相当棘手。
我想这可能会走layoutSubviews 的路线,但我不确定你如何将它与需要计算单元格高度的表格结合起来。 Another interesting post 在初始化时手动设置框架,以确保他们根据已知数量进行计算,但这仅解决了部分问题。
这是我正在处理的图像,红色箭头指向动态高度标签,蓝色箭头指向将改变高度的单元格。
我已经设法让它正常工作,但不确定它是否是正确的方法。
以下是我学到的一些东西:
-
cellForRowAtIndexPath中的 cell.frame 始终在纵向模式下给出其大小。 (即对于 iphone 应用程序,它总是报告 320)。 - 将原型单元格存储在属性中以供参考存在同样的问题,始终处于纵向模式
- 自动调整标签宽度的掩码在此用例中似乎没有用,实际上会导致计算的旋转高度出现问题
-
cellForRowAtIndexPath中的 tableView.frame 以正确的方向给出了它的大小 - 您需要轮流致电
[tableView reloadData]。我找不到任何其他方法来更新单元格和标签高度
以下是我为使这项工作为我所采取的步骤:
- 禁用 UILabel 上的任何自动调整大小蒙版,因为它们会因某种原因干扰获得正确的标签高度
-
在
viewDidLoad上,我抓取了对每个标签字体的引用,以及与纵向中的 tableView 相比标签宽度百分比的浮点数CWProductDetailDescriptionCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"DescriptionCell"]; self.descriptionLabelWidthPercentage = cell.descriptionLabel.frame.size.width / 320; self.descriptionLabelFont = cell.descriptionLabel.font; -
在
heightForRowAtIndexPath中,我使用 tableView 宽度和我已经抓取的百分比来计算单元格高度:case TableSectionDescription: CGFloat labelWidth = self.tableView.frame.size.width * self.descriptionLabelWidthPercentage; CGSize newLabelFrameSize = [self sizeForString:self.product.descriptionText WithConstraint:CGSizeMake(labelWidth, MAXFLOAT) AndFont:self.descriptionLabelFont]; return newLabelFrameSize.height + kTextCellPadding; -
在
cellForRowAtIndexPath中我为标签框架计算框架并更新它cell = [tableView dequeueReusableCellWithIdentifier:@"DescriptionCell"]; ((CWProductDetailDescriptionCell *)cell).descriptionLabel.text = self.product.descriptionText; CGRect oldFrame = ((CWProductDetailDescriptionCell *)cell).descriptionLabel.frame; CGFloat labelWidth = self.tableView.frame.size.width * self.descriptionLabelWidthPercentage; CGSize newLabelFrameSize = [self sizeForString:self.product.descriptionText WithConstraint:CGSizeMake(labelWidth, MAXFLOAT) AndFont:((CWProductDetailDescriptionCell *)cell).descriptionLabel.font]; ((CWProductDetailDescriptionCell *)cell).descriptionLabel.frame = CGRectMake(oldFrame.origin.x, oldFrame.origin.y, labelWidth, newLabelFrameSize.height); 在
didRotateFromInterfaceOrientation你需要[self.tableView reloadData]
这个方法的问题:
- 您无法利用 might set in IB 自动调整大小的蒙版和边距
- 如果您的标签宽度在 portrait 和 landscape 中的百分比不相等,则您需要知道这两个百分比
- 您需要知道/计算您的标签宽度百分比。理想情况下,您可以在自动调整大小的蒙版完成其操作后即时计算这些。
- 只是感觉很笨拙。我感觉在带有缩进的编辑模式下我会遇到更多的麻烦。
所以。这样做的正确方法是什么?我见过很多这样的问题,但没有一个能完全解决这个问题。
【问题讨论】:
-
它的 BS 苹果造成了这样的问题
-
我在纯纵向视图中遇到了这些问题。使用具有动态高度的 Storyboard 中的动态原型(例如,以适应各种高度 cmets)会导致视图超出我在 heightForRowAtIndexPath 中告诉它的范围。如果我在 willDisplayCell 中禁用自动调整大小和布局,则 Bob Spryn 下面的回答对我来说大致适用。很想提交一个错误,但不确定如何完全解释它。