iOS 开发之 AutoLayout 自动布局

iOS 开发之 AutoLayout 自动布局



frame 原点自身的尺寸 来确定自身的位置

autoLayout 根据参照视图的位置来定义自己的位置

autoLayout 约束视图和视图的关系来分配屏幕上的位置

 

// 使用VFLVisual Format Language视觉格式语言)通过添加字符串来约束视图和视图之间的关系

使用 autoLayout,必须把 translatesAutoresizingMaskIntoConstraints禁用才可以使用


相对布局是找一个参照物 拿参照物当做基础,设置他和参照物的相对距离来设置自己的位置

 

VFL 需有横竖两个方向的约束 H:横向  V:竖向  |表示他的父视图  -50-表示两个视图的间距

 

 

H:横向

| 表示他的父视图

-50- 表示后面视图与前面视图的距离(后面视图是textField,前面视图是他的父视图)

[textField(>=200)] 要约束视图的宽  (>=200)允许最小的宽度是200 如果是竖向 就是允许最小的高度

@"H:|-50-[textField(>=200)]-50-|"

距离坐边原点距离50  右边边界距离50   允许视图的最小宽度是200

 

 

V: 竖向

使用autoLayout适配的时候,以最小尺寸设备为基准

VFL  横向竖向布局

@"H:" 设置横向布局

@"V:" 设置竖向布局

设置横向布局 距离参照视图的左侧边距

@"H:|-20-"

@"H:[view]-20-"

@"H:|-20-[view(200)]" view的宽  永远是200

@"H:|-20-[view(otherView)]" view的宽 otherView的宽相同

@"H:|-20-[view(>=200)]" 设置横向布局距离参照视图的左侧边距设置view横向的尺寸不能低于200

@"H:|-20-[view(>=200)]-20-|" 设置横向布局距离参照视图的左侧边距 设置view横向的尺寸 不能低于200 设置右侧与参照视图之间的间距


视图使用属性的时候绑定 key 需要绑定它真实的名字  _titleLable

self.titleLable = _titleLable



一个视图

- (void)demo1
{
    UIView *view = [[UIView alloc]init];
//    如果使用 autoLayout 下面这个属性必须禁用
    view.translatesAutoresizingMaskIntoConstraints = NO;
    view.backgroundColor = [UIColor grayColor];
    [self.view addSubview:view];
    
//    VFL 横向 竖向 布局
//    横向  @"H:" 设置横向布局
//    @"H:|-20-" 设置横向布局 距离父视图的左侧边距
//    @"H:|-20-[view(>=200)]" 设置横向布局 距离父视图的左侧边距 设置view 横向的尺寸,不能低于200
//    @"H:|-20-[view(>=200)]-20|" 设置横向布局 距离父视图的左侧边距 设置view 横向的尺寸,不能低于200,设置右侧与父视图之间的间距
    
//    竖向布局
//    @"V:|-40-[view(>400)]-20-|"
    
//    使用VFL 需把视图的对象(视图)与他的名字(字符串)绑定起来
    
    NSDictionary *views = NSDictionaryOfVariableBindings(view);
    
//    给self.view 和view 添加约束
//    addConstraint 添加约束
//    NSLayoutConstraint 具体添加约束的一个类
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[view(>=200)]-20-|" options:0 metrics:nil views:views]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[view(>=200)]-20-|" options:0 metrics:nil views:views]];
    

//    Format: VFL
//    options : 同意按照某个反向去布局
//    metrics 绑定的参数
//    views 绑定视图的参数
    
}



两个视图的相对布局

// 两个视图
- (void)demo2
{
    UIView *view = [[UIView alloc]init];
//    如果使用 autoLayout 下面这个属性必须禁用
    view.translatesAutoresizingMaskIntoConstraints = NO;
    view.backgroundColor = [UIColor grayColor];
    [self.view addSubview:view];
    
    
    
    UIView *view1 = [[UIView alloc]init];
    //    如果使用 autoLayout 下面这个属性必须禁用
    view1.translatesAutoresizingMaskIntoConstraints = NO;
    view1.backgroundColor = [UIColor redColor];
    [self.view addSubview:view1];
    
    
    NSDictionary *views = NSDictionaryOfVariableBindings(view,view1);
    
//    红色 view 的约束
//    @"H:|-20-[view(>=200)]-20-|"
//    @"V:|-40-[view(50)]-10-[view1]"
    
    
//    黄色 view1 的约束
//    @"H:|-20-[view1(>=200)]-20-|"
//    @"V:[view]-10-[view1(50)]"
    
    
//    红色 view 横向的约束
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[view(>=200)]-20-|" options:0 metrics:nil views:views ] ];
//    红色 view 竖向的约束
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[view(50)]-10-[view1]" options:0 metrics:nil views:views]];
    
    
//    黄色视图的横向约束1
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[view1(>=200)]-20-|" options:0 metrics:nil views:views ] ];

//    黄色视图的竖向约束
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[view]-10-[view1(50)]" options:0 metrics:nil views:views ] ];
    
    
}


优化 demo2

- (void)demo3
{
    NSArray *colorList = @[[UIColor redColor],[UIColor yellowColor]];
    for (int i = 0; i<2; i++)
    {
        UIView *view = [[UIView alloc]init];
        view.translatesAutoresizingMaskIntoConstraints = NO;
        view.backgroundColor = colorList[i];
        view.tag = 10+i;
        [self.view addSubview:view];
        
    }
    
    UIView *redView = [self.view viewWithTag:10];
    UIView *yellowView = [self.view viewWithTag:11];
    
    
    NSDictionary *views = NSDictionaryOfVariableBindings(redView,yellowView);
    
   
    
//    两个视图横向的 约束
    NSArray *constraints = @[@"H:|-20-[redView(>=200)]-20-|",@"H:|-20-[yellowView(>=200)]-20-|"];
    for (NSString *VFL in constraints)
    {
       [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:VFL options:0 metrics:nil views:views ] ];
    }
    
    
//   红色 view 黄色 view 两个视图的高度都是50
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[redView(50)]-10-[yellowView(redView)]" options:0 metrics:nil views:views ]];
    
}



三个视图的相对布局

- (void)demo5
{
    NSArray *colorList = @[[UIColor redColor],[UIColor yellowColor],[UIColor blueColor]];
    for (int i = 0; i<3; i++)
    {
        UIView *view = [[UIView alloc]init];
        view.translatesAutoresizingMaskIntoConstraints = NO;
        view.backgroundColor = colorList[i];
        view.tag = 10+i;
        [self.view addSubview:view];
    }
    
    UIView *redView = [self.view viewWithTag:10];
    UIView *yellowView = [self.view viewWithTag:11];
    UIView *blueView = [self.view viewWithTag:12];
    
    
    NSDictionary *views = NSDictionaryOfVariableBindings(redView,yellowView,blueView);

//    @"H:|-20-[redView(>=200)]-20-|"
//    @"H:|-20-[yellowView(>=100)]-10-[blueView(yellowView)]-20-|"
    
//    横向 约束关系 数组
    NSArray *HList = @[@"H:|-20-[redView(>=200)]-20-|", @"H:|-20-[yellowView(>=100)]-10-[blueView(yellowView)]-20-|"];
    
//    竖向  红色视图与蓝色视图  红色视图与黄色视图   约束关系 数组
    NSArray *VList = @[@"V:|-40-[redView(50)]-10-[yellowView(redView)]",@"V:|-40-[redView(50)]-10-[blueView(redView)]"];
    
    
    for (int i = 0; i<VList.count ; i++)
    {
        
       [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:HList[i] options:0 metrics:nil views:views ] ];
       [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:VList[i] options:0 metrics:nil views:views ] ];
        
    }
    
}




效果图






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值