【问题标题】:Remove one view's layout constraints but keep its subviews'?删除一个视图的布局约束但保留其子视图?
【发布时间】:2015-09-30 03:36:45
【问题描述】:

在 iOS 8 中使用故事板和自动布局处理项目:

  1. 在情节提要中,为此视图及其子视图指定了约束
  2. 在代码中,为了响应触摸事件,我将通过设置它的框架来改变这个视图的大小

为了使 1 和 2 都没有警告,我在第一次使用代码更改其大小时执行以下操作:

[theView removeConstraints:theView.constraints];
theView.translatesAutoresizingMaskIntoConstraints = YES;
theView.frame = CGRectMake(0,0,width,height);

如果不做第一行,Xcode 会抱怨一大堆关于约束冲突的问题,但是添加这一行也会删除其所有子视图的约束。所以我的问题是:有没有办法只删除这个 uiview 的约束而不是它的子视图,比如它上的一个按钮仍然想相对于这个视图的大小和位置居中?

【问题讨论】:

  • 为什么需要通过设置frame来改变view的大小?我认为避免您所描述的问题的“正确”方法是为 theView 的大小约束添加 IBOutlets,因为它们在情节提要中设置,然后在代码中修改这些约束。
  • 我正在这样做,它在运行代码时会删除警告,但是现在在情节提要中,显示布局指南(虚线)警告,如果“更新框架”,它的子视图将超出地方。可能我在这方面太强迫症了:)

标签: ios objective-c xcode autolayout constraints


【解决方案1】:

首先,您不需要通过设置框架来调整视图大小,否则将约束保持在首位有什么意义。您可以通过简单地拥有正确的初始帧来定位。

其次,您对已应用约束的“TO-WHOM”有误解。

说它上面的按钮仍然想相对于这个视图的大小和位置居中?

当您将位置相关约束应用于视图时,通常会将其应用于superview。表示如果要将subview 定位在view 的水平中心,则将约束添加到view 而不是subview。这就是为什么当您在视图上调用 removeContraints: 消息时,位置约束已被删除,现在您的子视图未绑定到任何约束。然而,宽度和高度约束应用于子视图本身。

要解决这个问题,您需要为您需要修改的约束创建IBOutlets,在您的情况下应该是宽度、高度、水平 x 和顶部约束;然后分别改变它们的常数值。

theView.widthConstraint.constant = newValue;

【讨论】:

  • 确实,我这里提到的错误概念,现在澄清了:)。因为我只是在改变高度,所以 IBOutlet 编辑它并且它有效。谢谢!