为什么模态呈现视图控制器会破坏表格视图中的自动布局?

时间:2014-11-20 03:18:40

标签: ios uitableview uiview autolayout nslayoutconstraint

示例项目: http://cl.ly/1o2K2m2r262q

我有UITableView个自定义单元格,其高度是根据自动布局自动计算的。自定义单元格中有三个标签,每个标签在彼此和内容视图之间以垂直间距定位,并从左侧推开。

当我输入数据并加载数据时效果很好。

然而,当我从托管表视图的视图控制器模态呈现视图控制器时,我注意到它在我返回到原始视图控制器时完全中断了自动布局。

这会导致什么?我将数据填充到一个简单的数组中,该数组充当表视图数据源的模型,然后它只是自动布局。这是一个如此简单的项目,我很困惑它会搞乱。

添加:我很感激rdelmar的回答,但我无法相信现在还没有发送单一应用利用iOS 8的动态单元格功能,而不会产生非常跳跃的表格视图。这将是令人难以置信的显着。有人必须想出办法使这项工作,否则他们永远不会发货。

4 个答案:

答案 0 :(得分:2)

你有几个问题。在故事板中,场景列表中有一个红色警告箭头。你不应该忽视这一点。点击它并进行它建议的更改(首先执行压缩阻力值,我认为拥抱它的内容会自行消失)。

在MasterViewController的viewDidLoad中,添加自行调整大小单元所需的这两行,

self.tableView.estimatedRowHeight = 120
self.tableView.rowHeight = UITableViewAutomaticDimension // you may not need this one, I think it might be the default now

最后,我发现当我在故事板中创建单元格(而不是在代码中)时,我需要将以下方法添加到单元格类中,因此布局会立即发生(否则它不会正确布局,直到你滚动或旋转),

override func didMoveToSuperview() {
        self.layoutIfNeeded()
    }

答案 1 :(得分:0)

问题在于您的标签的抗压性: 你有描述,哪个标签更能抵抗高度变化: 尝试为内容拥抱优先级设置不同的值 - >垂直和内容压缩阻力优先 - >垂直标签:

  • "动物小清单"
  • "动物名单"
  • "更小的列表"

您还使用自动UITableView单元格的高度计算,但您需要为其设置表格:

override func awakeFromNib() {
    super.awakeFromNib()
    tableView.estimatedRowHeight = 200; // You need approximately calculate this value by yourself, used mostly for the scroll indicator displaying
    tableView.rowHeight = UITableViewAutomaticDimension;
}

或检查更新后的项目 https://dl.dropboxusercontent.com/u/48223929/LayoutingTest.zip

答案 2 :(得分:0)

解决方案比您想象的要容易得多。您已要求故事板构建一个行高为44的tableview。在Storyboard中选择tableView并检查:

Old tableView row height

您必须将tableView初始行高设置为比您认为的单元格扩展更大的值,例如200或更多:

Suggested tableView row height

然后,当iOS尝试构建一个高度为200的新单元格时,它会填充标签,计算大小,然后缩小单元格。

为什么会这样?

我认为 - 不确定 - 线索是iOS构建tableViews的方式。 iOS总是在iPhone上显示8-10个单元格,如果单元格最初大于它的实际计算高度,那么iOS会缩小单元格并创建/出列新单元格 - 如果需要 - 。如果单元格需要更大,那么 iOS可能需要隐藏最初要显示的行,然后它拒绝扩大您的单元格。这就是为什么 总是 更喜欢构建比较小的单元格更大的单元格。

答案 3 :(得分:0)

由于模态视图,问题没有发生。

这是由于您为表视图指定的行高。目前它的44,将其改为200或更高,一切都会正常工作。

Storyboard

同时检查故事板文件中的警告。