【问题标题】:Disabling Auto Layout For A Single UIImageView禁用单个 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 再次居中。

标签: ios objective-c autolayout


【解决方案1】:

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

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

您的选择:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    相关资源
    最近更新 更多