我正在尝试学习 Autolayout,所以我正在阅读教程,并且还弄乱了一些 UIView,只是为了看看我可以让他们做什么。我想知道如何在使用自动布局从纵向过渡到横向时完成如下图所示的操作?例如,我认为如果我将黄色固定在视图的顶部,蓝色固定在黄色,橙色固定在蓝色,橙色固定在底部,它们会按比例调整大小,保持彼此之间的 20 个像素以及视图的顶部和底部。但是,例如,蓝色框不会让我将其移除到视图的顶部,即使它固定在其上方的黄色视图上,因此它会将所有内容向下推并从横向屏幕上移开。我知道你可以同样固定高度和宽度来调整它们的大小,
2 回答
在 Interface Builder 中进行约束可能会令人沮丧,并且 Interface Builder 还不能使用乘数进行约束,例如blue.height = red.height * 0.5
. 不过,它们都很容易用代码制作。
我使用 Interface Builder 创建 UIView 并为其着色,所以首先我想删除 Interface Builder 创建的所有约束。
// in UIViewController.m
[self.view removeConstraints:self.view.constraints] ;
我将使用创建许多约束constraintsWithVisualFormat:options:metrics:views:
,因此我创建了一个指向 5 个 UIView 的指针字典,并创建了一个 NSMutableArray 来保存约束。
NSDictionary* views = NSDictionaryOfVariableBindings(black, red, yellow, blue, orange) ;
NSMutableArray* constraints = [NSMutableArray new] ;
然后我创建定位 UIView 的约束并指示具有相同宽度和高度的视图。
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[black]-[yellow]-|" options:0 metrics:nil views:views]] ;
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[red(==black)]-[blue(==yellow)]-|" options:0 metrics:nil views:views]] ;
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[orange]-|" options:0 metrics:nil views:views]] ;
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[black]-[red(==black)]-[orange]-|" options:0 metrics:nil views:views]] ;
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[yellow]-[blue]-[orange]-|" options:0 metrics:nil views:views]] ;
最后,我使用乘数创建约束,并添加所有约束。
[constraints addObject:[NSLayoutConstraint constraintWithItem:orange attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:black attribute:NSLayoutAttributeHeight multiplier:0.5 constant:0]] ;
[constraints addObject:[NSLayoutConstraint constraintWithItem:yellow attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:black attribute:NSLayoutAttributeHeight multiplier:1.5 constant:0]] ;
[constraints addObject:[NSLayoutConstraint constraintWithItem:yellow attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:black attribute:NSLayoutAttributeWidth multiplier:1.5 constant:0]] ;
[self.view addConstraints:constraints] ;
您可以按照以下步骤给出成比例的高度或宽度约束。
1)首先根据要求给出一个相等的高度或宽度约束。
2) 双击右侧窗格中的约束或单击约束右侧的“编辑”。
3)像这样改变乘数。如果您已将宽度为 100 的视图的等宽约束添加到宽度为 150 的视图中,则输入乘数 150:100。
4)您需要确保不会有任何关于此约束的警告,否则您需要更改乘数,例如 100:150。
5) 发生这种情况是因为有时当您给出相等的宽度或高度约束时,第一个视图将是视图本身,有时第一个视图将是另一个视图。这完全取决于您为其他视图设置的其余约束。
6) 现在,当正确应用约束时,应用其他约束并检查。
谢谢你。