使用自动布局更改约束

Posted

技术标签:

【中文标题】使用自动布局更改约束【英文标题】:Changing constraints with auto layout 【发布时间】:2013-08-14 16:00:22 【问题描述】:

我在视图中有一个方形按钮网格,非常适合 iPhone 5。我现在希望它在 3.5 英寸屏幕上也能看起来不错。我正在使用自动布局,并且我为 3.5 英寸创建了新图像,它们的高度稍小一些,以便它们适合屏幕(它们不再是正方形)。据我了解,您在使用自动布局时不能像往常一样使用框架?相反,您应该使用约束。但我该怎么做呢?

基本上我需要做的是改变按钮的y坐标和高度。

这是 4 英寸屏幕(底部的标签栏)上的屏幕外观示例。

【问题讨论】:

【参考方案1】:

在 VFL 中表示这个,你想要的是这样的:

使垂直的红色框垂直大小均匀,跨越其父视图的垂直范围:

@"V:|-[subview1]-[subview2(==subview1)]-[subview3(==subview1)]-|"
@"V:|-[subview4]-[subview5(==subview4)]-[subview6(==subview4)]-|"

同样,使框的大小水平均匀,也跨越其父视图的水平范围:

@"H:|-[subview1]-[subview4(==subview1)]-|"
@"H:|-[subview2]-[subview5(==subview2)]-|"
@"H:|-[subview3]-[subview6(==subview3)]-|"

这使得六个子视图在它们的父视图中大小相等且间隔均匀。这说明了自动布局的优点之一,因为我们非常明确地避免了对yheight 值的任何引用。我们只需要定义视图、它们的兄弟姐妹和它们的父视图之间的关系,其余的由自动布局处理。

无论您是使用上述 VFL 还是在 Interface Builder 中以编程方式执行此模式,此模式都适用,但希望它能够说明这一概念。

或者,您可以使用UICollectionView,该UICollectionView 设计用于分隔这些控件,您可以对其进行设置,以便正确调整纵向和横向布局。


例如,要将六个图像视图添加到我的视图中,我可以将 QuartzCore.framework 添加到项目中(我可以使用它来创建带有圆角的红色图像视图背景),然后导入标题:

#import <QuartzCore/QuartzCore.h>   // and 

然后在viewDidLoad:

NSMutableArray *subviews = [NSMutableArray array];

for (NSInteger i = 0; i < 6; i++)

    UIImageView *subview = [[UIImageView alloc] init];
    [subviews addObject:subview];
    subview.layer.cornerRadius = 10.0;
    subview.backgroundColor = [UIColor redColor];
    subview.contentMode = UIViewContentModeCenter;
    subview.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:subview];


NSDictionary *views = @@"subview1": subviews[0],
                        @"subview2": subviews[1],
                        @"subview3": subviews[2],
                        @"subview4": subviews[3],
                        @"subview5": subviews[4],
                        @"subview6": subviews[5];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[subview1]-[subview2(==subview1)]-[subview3(==subview1)]-|" options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[subview4]-[subview5(==subview4)]-[subview6(==subview4)]-|" options:0 metrics:nil views:views]];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[subview1]-[subview4(==subview1)]-|" options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[subview2]-[subview5(==subview2)]-|" options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[subview3]-[subview6(==subview3)]-|" options:0 metrics:nil views:views]];

然后,如果我使用具有透明背景的 PNG 图像,我可以为这六个图像视图设置 image 属性,让自动布局定义 frame,QuartzCore 会做漂亮的圆角等。

【讨论】:

以上是关于使用自动布局更改约束的主要内容,如果未能解决你的问题,请参考以下文章

自动布局 [Snapkit] 更改旋转约束

UICollectionView 上的动画自动布局约束更改

更改方向的自动布局约束

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何更改自动布局约束

如何在使用constraintEqualToAnchor()设置它们后更改自动布局约束?