iOS - 自动布局

  • 简述

    自动布局被引入 iOS 6.0.当我们使用自动布局时,我们的部署目标应该是 6.0 及更高版本。自动布局帮助我们创建可用于多个方向和多个设备的界面。
  • 我们示例的目标

    我们将添加两个按钮,它们将放置在距屏幕中心一定距离的位置。我们还将尝试添加一个可调整大小的文本字段,该字段将放置在距按钮上方一定距离的位置。
  • 我们的方法

    我们将在代码中添加一个文本字段和两个按钮以及它们的约束。每个 UI 元素的约束将被创建并添加到超级视图中。我们将不得不为我们添加的每个 UI 元素禁用自动调整大小以获得所需的结果。
  • 涉及步骤

    步骤 1 − 创建一个简单的基于视图的应用程序。
    步骤 2 - 我们将只编辑 ViewController.m,如下所示 -
    
    #import "ViewController.h"
    @interface ViewController ()
    @property (nonatomic, strong) UIButton *leftButton;
    @property (nonatomic, strong) UIButton *rightButton;
    @property (nonatomic, strong) UITextField *textfield;
    @end
    @implementation ViewController
    - (void)viewDidLoad {
       [super viewDidLoad];
       UIView *superview = self.view;
       /*1. Create leftButton and add to our view*/
       self.leftButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
       self.leftButton.translatesAutoresizingMaskIntoConstraints = NO;
       [self.leftButton setTitle:@"LeftButton" forState:UIControlStateNormal];
       [self.view addSubview:self.leftButton];
       /* 2. Constraint to position LeftButton's X*/
       NSLayoutConstraint *leftButtonXConstraint = [NSLayoutConstraint 
       constraintWithItem:self.leftButton attribute:NSLayoutAttributeCenterX 
       relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:superview attribute:
       NSLayoutAttributeCenterX multiplier:1.0 constant:-60.0f];
       /* 3. Constraint to position LeftButton's Y*/
       NSLayoutConstraint *leftButtonYConstraint = [NSLayoutConstraint 
       constraintWithItem:self.leftButton attribute:NSLayoutAttributeCenterY 
       relatedBy:NSLayoutRelationEqual toItem:superview attribute:
       NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f];
       /* 4. Add the constraints to button's superview*/
       [superview addConstraints:@[ leftButtonXConstraint,
       leftButtonYConstraint]];
       /*5. Create rightButton and add to our view*/
       self.rightButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
       self.rightButton.translatesAutoresizingMaskIntoConstraints = NO;
       [self.rightButton setTitle:@"RightButton" forState:UIControlStateNormal];
       [self.view addSubview:self.rightButton];
       /*6. Constraint to position RightButton's X*/
       NSLayoutConstraint *rightButtonXConstraint = [NSLayoutConstraint 
       constraintWithItem:self.rightButton attribute:NSLayoutAttributeCenterX 
       relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:superview attribute:
       NSLayoutAttributeCenterX multiplier:1.0 constant:60.0f];
       /*7. Constraint to position RightButton's Y*/
       rightButtonXConstraint.priority = UILayoutPriorityDefaultHigh;
       NSLayoutConstraint *centerYMyConstraint = [NSLayoutConstraint 
       constraintWithItem:self.rightButton attribute:NSLayoutAttributeCenterY 
       relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:superview attribute:
       NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f];
       [superview addConstraints:@[centerYMyConstraint,
       rightButtonXConstraint]];
       //8. Add Text field
       self.textfield = [[UITextField alloc]initWithFrame:
       CGRectMake(0, 100, 100, 30)];
       self.textfield.borderStyle = UITextBorderStyleRoundedRect;
       self.textfield.translatesAutoresizingMaskIntoConstraints = NO;
       [self.view addSubview:self.textfield];
       //9. Text field Constraints
       NSLayoutConstraint *textFieldTopConstraint = [NSLayoutConstraint 
       constraintWithItem:self.textfield attribute:NSLayoutAttributeTop 
       relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:superview 
       attribute:NSLayoutAttributeTop multiplier:1.0 constant:60.0f];
       NSLayoutConstraint *textFieldBottomConstraint = [NSLayoutConstraint 
       constraintWithItem:self.textfield attribute:NSLayoutAttributeTop 
       relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:self.rightButton 
       attribute:NSLayoutAttributeTop multiplier:0.8 constant:-60.0f];
       NSLayoutConstraint *textFieldLeftConstraint = [NSLayoutConstraint 
       constraintWithItem:self.textfield attribute:NSLayoutAttributeLeft 
       relatedBy:NSLayoutRelationEqual toItem:superview attribute:
       NSLayoutAttributeLeft multiplier:1.0 constant:30.0f];
       NSLayoutConstraint *textFieldRightConstraint = [NSLayoutConstraint 
       constraintWithItem:self.textfield attribute:NSLayoutAttributeRight 
       relatedBy:NSLayoutRelationEqual toItem:superview attribute:
       NSLayoutAttributeRight multiplier:1.0 constant:-30.0f];
       [superview addConstraints:@[textFieldBottomConstraint ,
       textFieldLeftConstraint, textFieldRightConstraint, 
       textFieldTopConstraint]];
    }
    - (void)didReceiveMemoryWarning {
       [super didReceiveMemoryWarning];
       // Dispose of any resources that can be recreated.
    }
    @end
    
  • 注意事项

    在标记为 1、5 和 8 的步骤中,我们只是分别以编程方式添加了两个按钮和一个文本字段。
    在剩下的步骤中,我们创建了约束并将这些约束添加到各自的超级视图中,它们实际上是自视图。左侧按钮之一的约束如下所示 -
    
    NSLayoutConstraint *leftButtonXConstraint = [NSLayoutConstraint 
    constraintWithItem:self.leftButton attribute:NSLayoutAttributeCenterX 
    relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:superview attribute:
    NSLayoutAttributeCenterX multiplier:1.0 constant:-60.0f];
    
    我们有constraintWithItem 和toItem 来决定我们在哪些UI 元素之间创建约束。该属性决定了将两个元素链接在一起的基础。“relatedBy”决定属性在元素之间有多大影响。乘数是乘数,常数将被添加到乘数中。
    在上面的例子中,leftButton的X相对于超级视图的中心总是大于或等于-60像素。类似地,定义了其他约束。
  • 输出

    当我们运行应用程序时,我们将在 iPhone 模拟器上获得以下输出 -
    iOS 教程
    当我们将模拟器的方向更改为横向时,我们将获得以下输出 -
    iOS 教程
    当我们在 iPhone 5 模拟器上运行相同的应用程序时,我们将得到以下输出 -
    iOS 教程
    当我们将模拟器的方向更改为横向时,我们将获得以下输出 -
    iOS 教程