0

我在我的示例应用程序中使用 AutoLayout。我有三个视图,topView、middleView、bottomView。以下是我需要的约束,

顶视图:

  1. 始终从 x 原点 10 开始。
  2. 左右边距 10.
  3. 高度应根据屏幕边界(或超级视图)而有所不同。

中间视图:

  1. 顶视图和中间视图之间应该有 10 px 的垂直边距。
  2. 左右边距 10.
  3. 高度应根据屏幕边界(或超级视图)而有所不同。

底部视图:

  1. 中间视图和底部视图之间应该有 10 px 的垂直边距。
  2. 左右边距 10.
  3. 高度应该是恒定的,比如 30。

我希望根据设备屏幕尺寸,底部视图 y 原点应该改变,以便调整中间和顶部视图尺寸。这里的问题是没有办法找出,底视图和界面的 y 原点应该是什么提供永久约束,例如:

  1. 中间视图的超级视图的顶部空间。
  2. 顶部空间以查看底部视图。

这是因为没有办法找出视图的高度。唯一的困难是确定顶视图和中间视图的高度。 在此处输入图像描述

4

1 回答 1

2

您似乎并不关心顶视图和中间视图的高度是多少,所以我只是要为您做出决定:它们将具有相同的高度。将以下约束添加到这三个视图(_topView、_middleView 和 _bottomView)是子视图的公共父视图中:

NSString *vfl = @"V:|-(10)-[topView]-(10)-[middleView]-(10)-[bottomView(==30)]-(10)-|";
NSDictionary *dict = @{@"topView":_topView,@"middleView":_middleView,@"bottomView":_bottomView};
NSArray *a = [NSLayoutConstraints 
                     constraintsWithVisualFormat: vfl
                                         options: 0
                                         metrics: nil
                                           views: dict];

确保你也水平对齐它们:

NSArray *b = [NSLayoutConstraints 
           constraintsWithVisualFormat: @"H:|-(10)-[topView]-(10)-|"
                               options: 0
                               metrics: nil
                                 views: dict];
NSArray *c = [NSLayoutConstraints 
            constraintsWithVisualFormat: @"H:|-(10)-[middleView]-(10)-|"
                                options: 0
                                metrics: nil
                                  views: dict];
NSArray *d = [NSLayoutConstraints 
            constraintsWithVisualFormat: @"H:|-(10)-[bottomView]-(10)-|"
                                options: 0
                                metrics: nil
                                  views: dict];

编辑

正如您所说,中间视图将是一个标签。标签具有固有的内容大小。如果你不设置这个视图的高度,自动布局系统会本能地知道要做什么。(整洁,对吗?)通过将 _topView 的顶部固定到超级视图的顶部,并将其底部固定到标签的顶部,它的高度应该会自动计算。我已经更改了代码以反映这一点。

编辑 2

为了在代码中添加约束,找到这三个视图的共同祖先(超级视图)并编写[superview addConstraints:a],[superview addConstraints:b], etc...确保 IB 中的自动布局已关闭并且您将其设置translateResizingMasksToConstraintsNO.

于 2013-07-18T14:01:32.087 回答