禁用单个 UIImageView 的自动布局

Posted

技术标签:

【中文标题】禁用单个 UIImageView 的自动布局【英文标题】:Disabling Auto Layout For A Single UIImageView 【发布时间】:2015-11-24 14:45:15 【问题描述】:

我的照片应用中有一个 UIImageView,它会根据导入的图像改变大小。尺寸是动态创建的,然后以编程方式定位在屏幕中心,而不使用自动布局。

现在我已经使用了

self.imageViewCanvas.translatesAutoresizingMaskIntoConstraints = YES;
[self.imageViewCanvas setFrame:CGRectMake(0, 0, screenWidth, screenHeight)];

禁用约束。问题是,每当我加载应用程序时,我都会收到一条包含以下内容的长警告消息:

无法同时满足约束条件。 以下列表中的至少一个约束可能是您不想要的。 试试这个: (1)查看每个约束并尝试找出您不期望的; (2) 找到添加了一个或多个不需要的约束的代码并修复它。 (注意:如果您看到不理解的 NSAutoresizingMaskLayoutConstraints,请参阅 UIView 属性 translatesAutoresizingMaskIntoConstraints 的文档) ( "", “” ) 将尝试通过打破约束来恢复 在 UIViewAlertForUnsatisfiableConstraints 创建一个符号断点以在调试器中捕获它。 中列出的 UIView 上的 UIConstraintBasedLayoutDebugging 类别中的方法也可能会有所帮助。

有没有办法禁用这个特定的警告,或者我可以通过某种方式调整代码来避免它?

谢谢

【问题讨论】:

imageViewCanvas 是在情节提要中创建的吗?如果是这样,它具有从情节提要加载的约束。你必须摆脱这些限制。 你对 imageview 有什么样的限制? 不,我不使用 Storyboard,而是使用 XIB。我只是在 UIView 上有一个 UIImageVIew,据我所知没有任何限制。 但是你为什么不想使用自动布局呢?我的意思是您可以添加宽度和高度约束并从代码中修改它们。定义布局以使您的 imageview 居中使事情变得容易,并且还支持开箱即用的旋转。 并不是我不想使用它们,这是我第一次真正尝试使用 AutoLayout,所以我想我会尝试通过将上述过程分开来简单地构建我的构建。我不确定如何以编程方式调整约束。加载图像时,我根据屏幕宽度动态设置高度,保持纵横比。在此过程之后不确定如何设置约束,以便 UIImageView 再次居中。 【参考方案1】:

对于启用了自动布局的故事板或 NIB,Xcode 将提供缺少的约束。这发生在构建时。如果您查看大小检查器以查找未添加任何约束的视图,您将看到一条有关 Xcode 为您添加约束的消息。所以,基本上,无论你做什么,图像视图都会受到限制。

如果您随后将 translatesAutoresizingMaskIntoConstraints 设置为 true,则会与自动提供的约束冲突。您可以删除/停用这些约束,但很难获得对它们的引用。

您的选择:

使用自动布局来定位图像视图。轻松实现您想要的。 关闭整个 NIB 的自动布局,因此不会有任何约束,translatesAutoresizingMaskIntoConstraints 默认为 true。 在 NIB 中添加足够的您自己的约束,但将它们标记为在构建时在属性或大小检查器上删除。这向 Xcode 发出您想要接管的信号,并阻止它提供自己的约束。 (这通常在您以编程方式提供约束时完成,但如果您只是要打开 translatesAutoresizingMaskIntoConstraints,它也可以工作。) 添加您自己的约束并为其设置出口。在打开 translatesAutoresizingMaskIntoConstraints 之前以编程方式停用它们。

【讨论】:

以上是关于禁用单个 UIImageView 的自动布局的主要内容,如果未能解决你的问题,请参考以下文章

删除特定对象的自动布局约束

以编程方式向 UIImageView 添加约束

没有图像的自动布局 UIImageView

uiimageview 自动布局问题

以编程方式自动布局和 UIImageView

将 UIImageView 与自动布局对齐