如何防止 UIImageView 使用 Autolayout 调整大小

Posted

技术标签:

【中文标题】如何防止 UIImageView 使用 Autolayout 调整大小【英文标题】:How to prevent UIImageView from resizing with Autolayout 【发布时间】:2012-12-21 22:50:53 【问题描述】:

我正在使用自动布局重新创建我的 UI,顶部有一个导航栏,屏幕其余部分有一个 2x2 的 UIImageView 网格。我设置了所有约束,因此它可以在任何方向上保持这种排列,并且当 UIImageViews 中没有图像时它运行良好。当我以编程方式在 UIImageViews 中加载图像时,它们会改变大小和位置,即使我有应该阻止这种情况的约束。

我关闭了所有内容的所有自动调整大小遮罩,并将 UIImageViews 设置为 Aspect fit。

这个自动布局的东西对我来说是新的,但我认为我已经成功了......直到我在那里放了一张图片。为什么这会改变 UIImageViews 的大小和位置?

感谢您的帮助!

【问题讨论】:

确保每个 UIImageViews 都有高度和宽度限制 如果我硬编码一个宽度和高度约束,当它切换方向时,它不会覆盖自动布局吗?我认为约束有助于避免硬编码的宽度和高度值...... 否...这是为了避免对框架进行硬编码,因为框架现在会随着容器大小的变化而变化。但是,如果你想要的行为是让你的框架的大小不改变......那么这就是你所做的,但框架的原始值仍然可以取决于容器 我想我错过了一些东西。如果我对宽度或高度进行硬编码,我会收到错误消息,指出它必须打破约束,并且当我旋转设备时,宽度和高度不正确,应该更改。 约束只是容器大小变化时要遵循的规则。如果你有一个尾随和导致超级视图约束和一个宽度,那么 3 应该加起来就是超级视图的宽度。如果他们不这样做,你会得到一个错误。所以你需要改变你的前导和尾随约束来做你想让他们做的事情。如果您只想让前导保持不变,则可以删除尾随约束。或者您可以使用小于或大于关系。 【参考方案1】:

如果您将约束与视图控制器中的插座链接,则可以在运行时修改它们。

对于您的情况,您将添加宽度和高度约束并将它们链接到两个出口。 然后在您知道图像尺寸后,您将更改常量值。

我正在详细描述我在这里遇到的类似用例:http://www.cocoanetics.com/2012/11/first-good-auto-layout-use-case/

【讨论】:

这是一个很大的帮助,谢谢。我很高兴我不是唯一一个因约束而疯狂的人。虽然我喜欢整个事情背后的推理,但实现还有很多不足之处。再次感谢。

以上是关于如何防止 UIImageView 使用 Autolayout 调整大小的主要内容,如果未能解决你的问题,请参考以下文章

防止从 UIImageView 到 superview 的触摸传输

防止 CAGradientLayer 在 UITableViewCell 上的 UIImageView 内重叠

防止 UITableViewCell 的 UIImageView 调整异步加载的 UIImage 的大小

防止 UIScrollView 中的 UISlider 触发滚动

当 XIB 没有时,UIImageView 在模拟器中调整大小

防止 CGAffineTransform 增量应用