13

我在视图中有一个视图:

+--------------+
|              |
|       +-----+|
|       |     ||
|       +-----+|
+--------------+

我希望内部视图始终从外部视图的中间水平开始,并将整个剩余的一半跨越到右边缘:

innerView.frame.size.width = outerView.frame.size.width/2;
innerView.frame.origin.x = outerView.frame.size.width/2;

我如何使用自动布局来表达这一点?

4

3 回答 3

16

您实际上可以在 IB/Storyboards 中做到这一点,早在 Xcode 5.1(可能更早)

  1. 在视图和超级视图之间创建宽度约束
  2. 将其关系设置为“相等”
  3. 将其设置为“0”
  4. 将其乘数设置为“2:1”或“1:2”(取决于约束中的项目顺序)

显然,IB 只允许将乘数设置为整​​数或比率,而不是浮点数。这是一个更清晰的屏幕截图

宽度一半的约束设置它是父级

注意:如果“第一项”和“第二项”翻转,则比例为“2:1”

于 2014-10-07T18:53:17.623 回答
7

我不认为你可以在 Interface Builder 中做到这一点,但通过在代码中创建约束很容易做到这一点。

您的第一个方程式正是我表达约束的方式。第二个等式可能有效,但将原点与宽度联系起来很奇怪。它们是不同的数量。相反,只需将 innerView 的右侧固定到 outerView 的右侧。

我们使用属性NSLayoutAttributeTrailing而不是NSLayoutAttributeRight,因此您的界面在本地化 RTL 时会正确翻转。

// innerView.width = outerView.width * 0.5
NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:innerView
                             attribute:NSLayoutAttributeWidth
                             relatedBy:NSLayoutRelationEqual
                                toItem:outerView
                             attribute:NSLayoutAttributeWidth
                            multiplier:0.5
                              constant:0];

// innerView.trailing = outerView.trailing
NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:innerView
                             attribute:NSLayoutAttributeTrailing
                             relatedBy:NSLayoutRelationEqual
                                toItem:outerView
                             attribute:NSLayoutAttributeTrailing
                            multiplier:1.0
                              constant:0];

[outerView addConstraints:@[widthConstraint, rightConstraint]];
于 2013-01-08T16:22:14.703 回答
0

您可以放入父视图的中间并删除界面构建器中的所有自动布局设置。如果您旋转它,它将始终处于同一位置事件。

于 2013-01-08T09:19:39.897 回答