使用自动布局更改约束

时间:2013-08-14 16:00:23

标签: iphone ios autolayout

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

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

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

Example

1 个答案:

答案 0 :(得分:3)

在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设计用于间隔这些控件,您可以对其进行设置,以便正确调整纵向和横向的布局。


例如,要在我的视图中添加六个图像视图,我可以将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]];

enter image description here

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