删除一个视图的布局约束但保留其子视图?

Remove one view's layout constraints but keep its subviews'?

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

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

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

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

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

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

其次,您对 "TO-WHOM" 应用了约束有误解。

say a button on it still wants to center its self relative to this view's size and position?

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

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

theView.widthConstraint.constant = newValue;