D31:AutoLayout

一. 为什么要使用自动布局

Frame
iPhone4S 320*480

iPhone5 5S 320*568

iPhone6 375*667

iPhone6plus 414*736

AutoLayout
针对不同屏幕的大小, 只需要使用同一份代码

  1. 系统自动布局的几种实现方式
1. 纯代码:   
    1. 添加一个个约束(约束: 用来描述视图相对于另外一个视图的位置). 因为屏幕的大小和视图控制器的view的bounds固定, 因此任何视图的位置只要相对于上面两个位置来设置即可  
    2. NSLayoutConstraint: 一个视图的某一个属性相对于另外一个视图的某一个属性的关系; 上述的属性包括left, right, bottom, width, height, 上述的关系: 二元一次表达式(y = kx + b)
2. 代码方式: 添加一个约束组, 用可视化语言的方式(理解略难, 不是所有的约束都可以用这种方式描述)  
3. XIB的方式
    1. priority: 优先级, 在0-1000之间, 默认为1000, 优先级越高, 当两个约束相互影响时, 默认选择优先级高的约束
    2. 约束的直线显示蓝色才表示约束设置正确, 否则有错误

二. 系统布局怎么使用

  1. 一个视图的显示
    1. 设置frame的方式: (30, 100, 80, 60)
    2. 视图居中显示
  2. 两个视图的显示
  3. 多个视图的显示

三. Masonry


二. 系统布局怎么使用

一个视图的显示(注意点:添加约束之前一定要将这个视图添加到父视图之上)
  1. 设置frame的方式
    **********************使用纯代码的方式**********************

    a. 创建一个视图(不用设置frame)

         UIView *redView = [[UIView alloc] init];
         redView.backgroundColor = [UIColor redColor];
    

    b. 不将Autoresize转化为AutoLayout的约束

         redView.translatesAutoresizingMaskIntoConstraints = NO;  
    

    c. 添加到父视图上

         [self.view addSubview:redView];
    

    d. 添加约束(添加约束之前一定要将这个视图添加到父视图之上)

         // 1) x相对于self.view.frame的x
         // redView.x == self.view.x * 1 + 30
         /*
          第一个参数: 第一个视图对象
          第二个参数: 第一个视图对象的某一个属性
          第三个参数: 第一个视图的属性相对于第二个视图的属性的关系(== >= <=)
          第四个参数: 第二个视图对象
          第五个参数: 第二个视图对象的属性
          第六个参数: 线性表达式的系数
          第七个参数: 线性表达式的常量
          */
         
         // 第一个视图对象(参数1)的属性(参数2)    关系(参数3)    第二个视图对象的属性(参数5) * 系数(参数6) + 常量(参数7)
         // (参1.参2) 参3 (参6.参2)*参5+参7 
         NSLayoutConstraint *xConstraint = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1 constant:30];
         
         // 2) y
         // redView.y == self.view.y * 1 + 100
         NSLayoutConstraint *yConstraint = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:100];
         
         // 3) width
         // redView.width = 80
         NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0 constant:80];
         
         // 4) height
         // redView.height = 60
         NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0 constant:60];
    

    e. 将该视图的约束添加到父视图或者间接父视图上面

         [self.view addConstraint:xConstraint];
         [self.view addConstraint:yConstraint];
         [self.view addConstraints:@[widthConstraint,heightConstraint]];
    

    **********************使用可视化语言的方式**********************

     - (void)viewDidLoad {
         [super viewDidLoad];
         // Do any additional setup after loading the view, typically from a nib.
         
         // 用可视化语言的方式布置布局
         // 1. 创建视图, 添加到父视图, 不将Autoresize转化为AutoLayout的约束
         UIView *redView = [[UIView alloc] init];
         redView.backgroundColor = [UIColor redColor];
         redView.translatesAutoresizingMaskIntoConstraints = NO;
         [self.view addSubview:redView];
         
         // 2. 创建约束
         // 可视化语言的方式, 每个视图一般只要在水平方向和垂直方向分别添加一个约束组就可以
         /*
          第一个参数: 可视化语言描述的字符串
          第二个参数: 一些选项(通常可以忽略)
          第三个参数: 可视化字符串里面的变量值
          第四个参数: 可视化字符串里面的对象的值
          */
         // "H:"表示水平方向(horizontal) "V:"表示垂直方向(vertical) 如果不写默认是水平方向
         // "|"表示父视图
         // "redView", 表示一个视图对象, 对象的变量名为redView, 用[]扩起来
         // "-30-"表示视图之间的间距
         // (==80)表示宽度是80
         NSArray *horConstrains = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-30-[redView(==80)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(redView)];
         
     //    参数是变量的状况
     //    CGFloat width = 100;
     //    NSArray *horConstrains = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-30-[redView(==mywidth)]" options:0 metrics:@{@"mywidth":[NSNumber numberWithFloat:width]} views:NSDictionaryOfVariableBindings(redView)];
         
         // 垂直方向
         NSArray *verContrains = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-100-[redView(60)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(redView)];
         
         // 3. 添加约束
         [self.view addConstraints:horConstrains];
         [self.view addConstraints:verContrains];
     }
    

    **********************使用XIB的方式**********************

    Leading Space to Superview

    Top Space to Superview
    Width
    Height
  2. 居中显示
    **********************使用纯代码的方式**********************
    - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

         // 代码方式实现自动布局
         // 1. 创建视图, 添加到父视图
         UIView *blueView = [[UIView alloc] init];
         blueView.backgroundColor = [UIColor blueColor];
         blueView.translatesAutoresizingMaskIntoConstraints = NO;
         [self.view addSubview:blueView];
         
         // 2. 创建约束
         // center.x
         // blueView.center.x == self.view.center.x * 1 + 0
         NSLayoutConstraint *centerXConstraint = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
         
         // center.y
         // blueView.center.y == self.view.center.y * 1 + 0
         NSLayoutConstraint *centerYConstraint = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];
         
         // width
         NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0 constant:200];
         
         // height
         NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0 constant:100];
         
         // 视图添加约束
         [self.view addConstraints:@[centerXConstraint, centerYConstraint, widthConstraint, heightConstraint]];
     }
    

    **********************使用XIB的方式**********************

    水平中心的设置

    垂直中心的设置

2. 两个视图的显示

**********************使用纯代码的方式**********************

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    // 1. 创建两个视图, 添加到父视图
    UIView *blueView = [[UIView alloc] init];
    blueView.backgroundColor = [UIColor blueColor];
    blueView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:blueView];
    
    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:redView];
    
    // 2个视图的约束
    // blueView
    // Left
    NSLayoutConstraint *blueLeftConstraint = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1 constant:20];
    // Top
    NSLayoutConstraint *blueTopConstraint = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:40];
    // Bottom
    NSLayoutConstraint *blueBottomConstraint = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1 constant:-200];
    
    // redView
    // Top
    NSLayoutConstraint *redTopConstraint = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:80];
    // Right
    NSLayoutConstraint *redRightConstraint = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1 constant:-30];
    
    // blueView和redView两个视图间的关系
    // 横向间距
    NSLayoutConstraint *xConstraint = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:redView attribute:NSLayoutAttributeLeft multiplier:1 constant:-30];
    // width相等
    NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:redView attribute:NSLayoutAttributeWidth multiplier:1 constant:0];
    // 高度相等
    NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:redView attribute:NSLayoutAttributeHeight multiplier:1 constant:0];
    
    [self.view addConstraints:@[blueLeftConstraint, blueTopConstraint, blueBottomConstraint, redTopConstraint, redRightConstraint, xConstraint, widthConstraint, heightConstraint]];
}  

**********************使用可视化语言的方式**********************

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    // 1. 创建两个视图, 添加到父视图
    UIView *blueView = [[UIView alloc] init];
    blueView.backgroundColor = [UIColor blueColor];
    blueView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:blueView];
    
    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:redView];
    
    // 2. 创建约束
    // x轴上
    NSArray *horizontalConstraint = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[blueView]-30-[redView(==blueView)]-30-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(blueView, redView)];
    
    // y轴上: (分开写)
    NSArray *blueVerticalConstraint = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[blueView]-200-|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(blueView)];
    
    // y轴上: 右边不需要加|(条件已足够)
    NSArray *redVerticalConstraint = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-80-[redView(==blueView)]" options:0 metrics:0 views:NSDictionaryOfVariableBindings(redView, blueView)];
    
    [self.view addConstraints:horizontalConstraint];
    [self.view addConstraints:blueVerticalConstraint];
    [self.view addConstraints:redVerticalConstraint];
}

**********************使用XIB的方式**********************

1.新建2个View, 为它们添加水平和垂直方向上的约束
2.设置2个View宽度相等
3.设置2个View高度相等
4.更新2个View的约束
5.修改约束里的系数和常量
3. 多个视图的显示
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容