请向我解释以下自动布局行为

Posted

技术标签:

【中文标题】请向我解释以下自动布局行为【英文标题】:Please explain the following auto layout behavior to me 【发布时间】:2014-09-21 10:43:56 【问题描述】:

我目前正试图找出我在使用以下基于约束的 UITableViewCell 布局 (ios 8) 时做错了什么。

我的单元格的布局如下图所示:

左边有一个图像视图,右边有一个标签,两者都应该接触到单元格边缘。图像具有固定尺寸(64x64),标签的高度总是小于那个。我希望图像的高度使单元格将高度扩展到正确的值(图像高度 + 2 * 边距)。

问题是这样的:我对垂直尺寸有三个约束,V[Image(64)]Reset.bottom == UITableViewCellContentView.bottomMarginReset.top == UITableViewCellContentView.topMargin(均通过情节提要定义)。当我显示单元格时,我得到一个不可满足的约束错误。 UIView-Encapsulated-Layout-Height 约束干扰了我的约束,并且自动布局打破了我的图像视图高度约束。一切看起来都应该如此,但我不喜欢运行时出现错误。

如果我给我的高度限制优先级 999,一切看起来都很好,没有错误。

所以我的理解是,我的高度限制在运行时在这两种情况下都会被打破。

但是当我完全删除高度约束时,图像会显示在其原始高度(文件的分辨率与我在单元格中显示的分辨率不同)。为什么会这样,或者我在这里做错了什么?

编辑/更新:我刚刚注意到我对一切正常工作都错了。我的单元格的初始显示很好,但是当单元格发生变化时(在我的情况下,我正在移动另一个简单的单行标签,它下面的单元格)我的单元格将其高度更改为默认行高(44 pts),挤压图像进行中。这两种情况都会发生,当自动布局打破我的约束或当我将高度的优先级降低到 999 时。我真的不知道如何让这些单元格做我想做的事。

【问题讨论】:

他们是否在 iOS 8 中做了一些新的事情,您现在可以从单元格本身调整表格视图单元格的大小? 是的,动态单元格高度有些问题。这是我认为的一切自动布局计划的一部分。基本上,tableView:heightForCellAtIndexPath 应该不再需要了。 如果是这样,它需要比在 iOS 7 中快几倍。我在单元格中使用了自动布局(即使 tableView:heightForCellAtIndexPath 返回相同的值),而且速度非常慢。 【参考方案1】:

您应该尝试在代码中设置estimatedRowHeight 属性,并且根据您使用的iOS 6 版本,将rowHeight 属性设置为UITableViewAutomaticDimension

self.tableView.estimatedRowHeight = 44;
self.tableView.rowHeight = UITableViewAutomaticDimension;

nib 或 storyboard 表格视图的默认 rowHeight 应该在某个时候更改为 UITableViewAutomaticDimension;我不知道它是否在 6.0.1 中,所以最后一行可能是必要的,也可能不是。

【讨论】:

对不起,我想我应该提到我已经尝试了这两行(在 viewDidLoad 中),但无济于事。另外,如果有任何改变,我将使用 Xcode 6.1 Beta。【参考方案2】:

您是否支持旧版本的 iOS?如果是这种情况,请务必取消选中正在抱怨的约束的 Relative to margin 选项。

【讨论】:

我决定学习新的做事方式,同时保持对我知之甚少的东西的向后兼容性对我来说太过分了,所以我只支持 iOS 8。一项属于超级视图的所有约束都相对于边距。

以上是关于请向我解释以下自动布局行为的主要内容,如果未能解决你的问题,请参考以下文章

自动布局比例间距

为啥自动布局不能产生一致的结果?

如何使用自动调整大小和自动布局并更改其默认行为? [关闭]

如何正确设置 4s 的自动布局约束?

为啥使用存储库模式或者请向我解释一下?

程序化自动布局更改 UIView 的行为