如何使用自动布局在其超级视图的一半中启动视图?

时间:2013-01-08 09:02:23

标签: objective-c ios cocoa autolayout

我在视图中有一个视图:

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

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

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

如何使用自动布局表达?

3 个答案:

答案 0 :(得分:16)

您实际上可以在IB / Storyboards中执行此操作,早在Xcode 5.1(可能更早)

  1. 在视图和超级视图之间创建宽度约束
  2. 将其与" Equal"
  3. 的关系设置为
  4. 将其设置为" 0"
  5. 将其倍数设置为" 2:1"或" 1:2" (取决于约束中的项目顺序)
  6. 显然,IB只允许将乘数设置为整​​数或比率,而不是浮点数。这是一个更清晰的屏幕上限

    Constraint setting for width half it's parent

    注意:如果" First Item"和"第二项"被翻转,比率是" 2:1"

答案 1 :(得分: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]];

答案 2 :(得分:0)

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