具有动态大小的ios自动布局

Posted

技术标签:

【中文标题】具有动态大小的ios自动布局【英文标题】:ios auto layout with dynamic size 【发布时间】:2017-01-05 17:51:28 【问题描述】:

我的UIViewController 中有一个视图,它有 4 个约束:左、右和底部的空格为 0,并且它有纵横比。它看起来像这样:

 ______             _
|      |             \
|      |             |
|      |             |- ViewController
|      |             |
|______|             |
|______| <- View    _/

我想在UIView 的中心插入一个具有动态大小的ImageView,并且我希望它保持在中心。我在代码中做了这个调整大小,但现在我想用 Auto-Layout 将它居中,但是当我水平和垂直居中时,它告诉我我需要对 ImageView 的大小进行更多限制。

我应该怎么做才能使ImageView 保持在中心并且自动布局不会抱怨这些缺少的大小限制?

【问题讨论】:

在垂直和水平居中后,自动布局可能需要更多的约束来确定该图像视图的大小。尝试从边距和纵横比添加高度和宽度约束或间距 但是您建议的这个约束将与 ImageView 调整大小冲突,但整个事情......我已经尝试添加这个约束......让我再试一次 如果你真的想在代码中调整图像大小,那么只需添加水平居中和垂直居中约束 n 离开它。让故事板显示需要更多约束的红色标记。它不会造成任何问题。 【参考方案1】:

根据您的问题,我假设您是在 Interface Builder 中进行设置的,如果我错了,请纠正我。

您的问题是在编译时没有完全指定布局。 UIImageView 具有可以完成布局的内在内容大小,但是由于您当时没有为图像视图设置图像,因此尚未指定。

您可以在UIImageView 的大小检查器中设置占位符大小。这在运行时没有影响,但会告诉编译器稍后会有一个内在的内容大小。

【讨论】:

【参考方案2】:

一个简单的解决方案:

只需在 Interface Builder 中为您的图像视图设置一个图像。(您可以使用任何您喜欢的图像作为占位符,并在运行时通过您的代码更改它。)


说明:

当您将具体图像分配给UIImageView 时,它假定intrinsicContentSize 等于图像的大小。这样,它就有了定义的宽度和高度,如果你限制它的位置(x 和 y),那么布局是明确的,Interface Builder 不会抱怨(也就是说,如果你的布局的其余部分完美无缺)。

如果您不想将图像用作占位符,则必须手动设置图像视图的宽度和高度,以便在 Interface Builder 中使用,如 iCaramba's answer 中所述。

【讨论】:

以上是关于具有动态大小的ios自动布局的主要内容,如果未能解决你的问题,请参考以下文章

具有动态大小的单元格的复杂自动布局

具有动态视图数量和自动布局 iOS6 的 UIScrollView

在具有自动布局的 UITableViewCell 中动态调整大小的 UIWebView - 违反约束

预览具有不同大小和语言样式的自动布局

iOS 8 自动布局 - 动态调整 4 个方形视图的大小

具有自动布局的 UITableView 中的动态单元格高度