1

我认为我对这些新的限制有一个根本性的问题。

想象一下,你在 UIView 中从上到下放置了 5 个标签。顶部标签在视图顶部与其下方的下一个标签之间等距分布。然后每个标签也是等距的。

我想要发生的是,当 UIView 高度变小或变大时,每个标签之间的空间会平均变化吗?

我应该瞄准什么。我应该使第三个标签在视图中垂直居中,然后从中心向其他标签添加约束,还是应该将 1 和 2 约束到视图的顶部、3 中心和 4 和 5 到底部?

提前感谢您的所有建议。

编辑: 添加以下答案后,我已经使用了界面构建器中的约束,虽然我不是 100% 确定我已经回答了它,但我认为我可以正常工作。

在所有标签之间我有一定的距离。但我也有一定的最小距离,比如跟随苹果 HIG 我认为标签之间是 15。所以我的是 30,我设置了大于或等于 15 的约束。现在,当超级视图发生变化时,iOS 会为我完成从 30 到 15 的所有移动。

4

1 回答 1

1

我最初是用按钮来做这个的,我可以让它工作的唯一方法是在每个按钮之间添加标签(没有文本,所以它们是不可见的),它会自动调整到视图框架大小(旋转时),在包含视图和第一个和最后一个按钮之间。这些按钮都有一个固有的大小,而标签没有,所以它们可以自由地改变它们的高度来填充空间。我修改了代码以使用所有标签,其中“b”标签是带有文本的标签。

-(void)viewDidLoad {
    [super viewDidLoad];

    NSMutableDictionary *viewsDict = [NSMutableDictionary dictionary];
    for (int i=1; i<5; i++) {
        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++) { // these are the 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];
} 

这将产生均匀间隔的标签,标准空间位于视图的左边缘。

于 2012-12-27T19:51:47.853 回答