Ios 使用“自动布局”在调整大小时均匀更改空间

Ios 使用“自动布局”在调整大小时均匀更改空间,ios,xcode,ios6,autolayout,Ios,Xcode,Ios6,Autolayout,如果我的应用程序中有一个包含3个子视图(例如)的视图,它们之间的间距如下: 顶部-40点-子视图1-60点-子视图2-80点-子视图3-80点-底部 我知道如何使用自动布局来确保每个子视图保持其高度和宽度,并且我可以在3.5英寸或4英寸的iPhone屏幕上对齐所有内容 但我无法确定需要设置什么样的约束条件,以便在3.5英寸屏幕上对齐,然后在4英寸屏幕上对齐时,每个间距都会成比例增加(例如,40个点会增加到47、60到71、80到95,或者差不多) 这可能吗?或者我需要使元素之间的所有间距相等吗

如果我的应用程序中有一个包含3个子视图(例如)的视图,它们之间的间距如下:

顶部-40点-子视图1-60点-子视图2-80点-子视图3-80点-底部

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


但我无法确定需要设置什么样的约束条件,以便在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];
} 

诀窍是在视图之间不仅添加一个约束,而且添加两个约束。一个是“大于或等于”的,另一个是“小于或等于”的。 最小尺寸(大于或等于)应为3.5英寸显示屏上的间距。 最大尺寸(小于或等于)应为4英寸显示屏上的间距

示例:

顶部-40点-子视图1-60点-子视图2-80点-子视图3-80点-底部

顶部-子视图1: 在界面生成器中选择两者。添加两次约束“垂直间距”。 将1设置为大于或等于40。 将另一个设置为小于或等于47

所有大于等于的值+视图的所有高度之和应为480像素(3.5”)
所有较小的Then值加上所有视图高度的总和应该是568像素(4“

太好了,谢谢你的想法。我将尝试一下,看看我是否可以把一些东西拼凑起来,接近我想要的:)在学习了很多如何使用自动布局之后,我成功地运用了你的想法。谢谢!给其他尝试此方法的人一个建议,检查没有任何自动添加的高度限制-因为这可能会导致旋转时的总高度大于屏幕大小。如果有,你可以简单地减少它们的先验值ty小于要应用的高度限制。另一个建议是,我在故事板中实现了这一点-即,以图形方式而不是通过代码。非常好!在我的例子中,SuperView>=0表示子视图和子视图
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];