【问题标题】:tableview:heightForRowAtIndexPath: Incorrect reporting content view size with AutoLayouttableview:heightForRowAtIndexPath:使用 AutoLayout 报告内容视图大小不正确
【发布时间】:2013-10-14 02:59:08
【问题描述】:

我有一个UITableViewCell,带有一个使用 AutoLayout 的自定义标签。它的约束设置为内容视图的前导、尾随、底部和顶部空间。这些单元格出现的表格视图控制器位于UISplitViewController 内。加载表格视图时,我使用以下代码计算单元格的高度:

CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
CGFloat height = size.height;

在纵向中,这使我可以正确显示单元格。这是部分单元格的屏幕截图:

但是,当我将 iPad 旋转为横向时,它没有计算出正确的尺寸,最终导致填充过多:

在旋转内容视图的大小时调用tableview:heightForRowAtIndexPath: 时设置断点未正确报告。事实上,它报告的是旧的、更窄的表格视图。

如何让我的单元格在 iPad 上使用 UISplitViewController 适当调整大小?

【问题讨论】:

  • 看起来您的单元格包含多行 UILabel。为了获得正确的高度,标签需要将preferredMaxLayoutWidth 属性正确设置为可用宽度(旋转设备时可能会有所不同)。如果您还没有看过这篇文章,请查看它以及 GitHub 上 cmets 中的示例项目:stackoverflow.com/questions/18746929/…
  • 您是否创建了额外的代码并将任何控件放入其中?您可以在此处添加您的代码吗?

标签: uitableview ios7 autolayout


【解决方案1】:

UILabel#preferredMaxLayoutWidth 影响 systemLayoutSizeFittingSize。 例如。您可以使用 Interface Builder 将 UILabel 放在 View 上。

  • superview的宽度为320px。
  • UILabel 的水平空间限制为 20px。

在这种情况下,UILabel#preferredMaxLayoutWidth 将设置为 280 像素。即使 Superview 的 frame.width 为 480px,systemLayoutSizeFittingSize 也会返回不超过 320px 的宽度。

其中一种解决方案是重写 CustomCell#setFrame 方法。

- (void)setFrame:(CGRect)frame {  
     [super setFrame:frame];  
     _label.preferredMaxLayoutWidth = frame.size.width - 20*2 /*Horizontal Spacing*/;   
}

然后你需要在更新label.text时更新布局。

_customCell.label.text = @"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
[_customCell setNeedsLayout];
[_customCell layoutIfNeeded];

【讨论】:

    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多