我的问题基本上归结为在 UITableCell 中支持 UILabel(我想是其他元素)的动态高度的最佳方法,并且在旋转时正确调整标签宽度/高度和单元格高度。
我知道如何获得 UILabel 的预期高度,并相应地调整高度,但是当你也支持横向时,事情似乎变得相当棘手。
我想这可能会走layoutSubviews的路线,但我不确定你如何将它与需要计算单元格高度的表格结合起来。另一个有趣的帖子在 init 上手动设置框架,以确保他们根据已知数量进行计算,但这仅解决了部分问题。
所以这是我正在处理的图像,红色箭头指向动态高度标签,蓝色箭头指向将改变高度的单元格。
我设法让它正常工作,但不确定它是否是正确的方法。
以下是我学到的一些东西:
- cell.frame
cellForRowAtIndexPath
总是在纵向模式下给出它的大小。(即对于 iphone 应用程序,它总是报告 320)。 - 将原型单元格存储在属性中以供参考具有相同的问题,始终处于纵向模式
- 在这个用例中,自动调整标签宽度的掩码似乎没用,实际上会导致计算的旋转高度出现问题
- 中的 tableView.frame 以
cellForRowAtIndexPath
正确的方向给出其大小 - 你需要调用
[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]
这种方法的问题:
- 您无法利用可能在 IB 中设置的自动调整大小掩码和边距
- 如果您的标签宽度在纵向和横向中的百分比不相等,则您需要知道这两个百分比
- 您需要知道/计算您的标签宽度百分比。理想情况下,您可以在自动调整大小的蒙版完成其操作后即时计算这些。
- 只是感觉很笨拙。我有一种感觉,在带有缩进的编辑模式下我会遇到更多的麻烦。
所以。这样做的正确方法是什么?我见过很多这样的问题,但没有一个能完全解决这个问题。