使用“自动布局”可在resize时均等地更改空格

如果我在我的应用程序中有3个子视图(作为示例)的视图,它们之间的间距如下所示:

TOP – 40分 – SUBVIEW 1 – 60分 – SUBVIEW 2 – 80分 – SUBVIEW 3 – 80分 – BOTTOM

我了解如何使用自动布局来确保每个子视图保持高度和宽度,并且我可以将所有内容在3.5或4英寸的iPhone屏幕上alignment。

但是我不能确定我需要做什么样的约束,所以如果它对准了一个3.5英寸的屏幕,然后去了一个4英寸的屏幕,每一个间距都会按比例增加(例如,40点将会到达47点,60至71,80至95或其附近)。

这可能吗? 还是我需要使所有的元素之间的间距相等? (如果是的话,我怎样才能让它平等调整?)

我是新来的汽车布局,所以如果我错过了什么,或者没有说清楚我的意思,请让我知道,谢谢。

我不知道有什么简单的方法来做到这一点。 我做了一个所有的空间都是平等的,但要做到这一点,我不得不用空白的标签填充空间(只是标签没有标题)。 所以,我把我的4个可见物体和5个“间隔标签”放在了一起。 我把这4个可见的物体都做成了明确的高度,没有固定的高度,但是都是一样的:

-(void)viewDidLoad { [super viewDidLoad]; NSMutableDictionary *viewsDict = [NSMutableDictionary dictionary]; for (int i=1; i<5; i++) { // Labels with titles UILabel *b = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 44)]; b.text = @"This is my label"; [b setTranslatesAutoresizingMaskIntoConstraints:NO]; [viewsDict setObject:b forKey:[NSString stringWithFormat:@"b%d",i]]; } for (int i=1; i<6; i++) { // Spacer labels UILabel *l = [[UILabel alloc ]init]; [l setTranslatesAutoresizingMaskIntoConstraints:NO]; [viewsDict setObject:l forKey:[NSString stringWithFormat:@"l%d",i]]; } for (id obj in viewsDict.allKeys) [self.view addSubview:viewsDict[obj]]; NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[l1][b1][l2(==l1)][b2][l3(==l1)][b3][l4(==l1)][b4][l5(==l1)]|" options:NSLayoutFormatAlignAllLeading metrics:nil views:viewsDict]; NSArray *constraints2 = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[b1]" options:0 metrics:nil views:viewsDict]; [self.view addConstraints:constraints]; [self.view addConstraints:constraints2]; } 

为了使空间不同,我认为你必须使用更长的expression约束的forms,而不是视觉格式。 下面的代码似乎为我工作。 我使用与上面相同的视图定义,除了我将标题标签的数量减less到3,并将间隔符减less到4以匹配您的问题。 相对间距应该和你的例子一样,2:3:4:4。

 NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeTop relatedBy:0 toItem:viewsDict[@"l1"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"b1"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b1"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"l2"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; NSLayoutConstraint *con4 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l2"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"b2"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; NSLayoutConstraint *con5 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b2"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"l3"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; NSLayoutConstraint *con6 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l3"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"b3"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; NSLayoutConstraint *con7 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b3"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"l4"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; NSLayoutConstraint *con8 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l4"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1 constant:0]; NSLayoutConstraint *con9 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeHeight relatedBy:0 toItem:viewsDict[@"l2"] attribute:NSLayoutAttributeHeight multiplier:.66 constant:0]; NSLayoutConstraint *con10 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeHeight relatedBy:0 toItem:viewsDict[@"l3"] attribute:NSLayoutAttributeHeight multiplier:.5 constant:0]; NSLayoutConstraint *con11 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeHeight relatedBy:0 toItem:viewsDict[@"l4"] attribute:NSLayoutAttributeHeight multiplier:.5 constant:0]; NSLayoutConstraint *con12 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b1"] attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:100]; NSLayoutConstraint *con13 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b2"] attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:100]; NSLayoutConstraint *con14 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b3"] attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:100]; NSArray *constraints = @[con1,con2,con3,con4,con5,con6,con7,con8,con9,con10,con11,con12,con13,con14]; [self.view addConstraints:constraints]; 

诀窍是在你的观点之间不仅添加一个而是两个限制 。 一个是“ 大于或等于 ”,另一个是“ less于或等于 ”。 最小尺寸(大于或等于)应该是3.5“显示屏上的间距,最大尺寸(小于或等于)应该是4”显示屏上的间距。

例:

TOP – 40分 – SUBVIEW 1 – 60分 – SUBVIEW 2 – 80分 – SUBVIEW 3 – 80分 – BOTTOM

TOP – SUBVIEW1:在Interface Builder中select。 添加约束“垂直间距” 两次。 将其中一个设置为Greater Then或Equal 40.将另一个设置为Lesser Then或Equal 47。

所有高于此值的总和+视图的所有高度之和应为480像素(3.5“)所有小于此值+视图的所有高度之和应为568像素(4”)