美文网首页
AutoLayout

AutoLayout

作者: 哲逗年 | 来源:发表于2017-09-26 10:08 被阅读0次

    在Autolayout情况下使用Frame

    1、在AutoLayout生效之前使用Frame,设置的Frame是无效的,因为系统会在布局完后重新计算Frame,例如在ViewDidLoad中先布局再设置了Frame。
    2、在AutoLaout生效之后是用Frame,例如有时候做动画的时候会改它的Frame,这时候是设置Frame是可以生效的,但是他的父View子View、统计View不会由于该View改变了Frame而重新布局,如果触发了父View的-layoutSubViews,又会根据自动布局重新设置Frame,设置的Frame又会被还原,所以最好不要在设置AutoLayout之后再去改Frame。(该种情况下可以考虑做动画完成后还原)。

    Priorities

    各个约束力量的大小,由constraint的优先级(Priorities)决定,优先级越高,力量越大。系统的优先级由1~1000的数字表示,值越大,优先级越高。NSLayoutConstraint中一共定义了4种比较常用的优先级

    typedef float UILayoutPriority
    static const UILayoutPriority UILayoutPriorityRequired NS_AVAILABLE_IOS(6_0) = 1000;
    static const UILayoutPriority UILayoutPriorityDefaultHigh NS_AVAILABLE_IOS(6_0) = 750;
    static const UILayoutPriority UILayoutPriorityDefaultLow NS_AVAILABLE_IOS(6_0) = 250;
    static const UILayoutPriority UILayoutPriorityFittingSizeLevel NS_AVAILABLE_IOS(6_0) = 50;
    

    1.UILayoutPriorityRequired,优先级最高,为1000,一般平时定的约束优先级都是这个。
    2.UILayoutPriorityDefaultHigh,优先级是750,CompressionResistance的默认优先级是这个。
    3.UILayoutPriorityDefaultLow,优先级是250,ContentHugging的默认优先级是这个。
    4.UILayoutPriorityFittingSizeLevel,优先级是50
    因为平时我们约束的默认优先级是UILayoutPriorityRequired,所以可以解释自定义约束label的size的时候,可以不根据其内容的大小自行设定其大小。

    ContentHugging和CompressionResistance

    ContentHugging指拉伸程度,该属性的优先级越高,越不容易被拉伸,其默认优先级是UILayoutPriorityDefaultLow(250)
    例子:如果label自适应的宽是100,设置了其约束宽为200,优先级为251,大于其默认优先级,所以宽会被拉伸至200。

    [label makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self).offset(100);
        make.left.equalTo(self).offset(100);
        make.width.equalTo(200).priority(251);
    }];
    

    结果如下图:

    优先级为251

    如果将优先级改为249,label的宽是不会给拉伸的,因为优先级小于其默认优先级,所以label的宽是内容自适应的宽


    优先级为249

    CompressionResistance是指压缩能力,该属性的优先级越高,越不容易被压缩,其默认优先级是UILayoutPriorityDefaultHigh(750)
    例子:如果label的自适应宽是100,是指了其约束宽为50,优先级是751,大于其默认优先级,所以宽会被压缩至50。

    [label makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self).offset(100);
        make.left.equalTo(self).offset(100);
        make.width.equalTo(50).priority(751);
    }];
    
    优先级是751

    如果将优先级改为749,label的宽是不会给压缩的,因为优先级小于其默认优先级,所以label的宽是内容自适应的宽


    优先级为749

    还有一个很好的例子,就是两个label并排,可以实现一个label的宽度自适应,另外一个label的宽度可自由伸缩。

    UILabel *label1 = [[UILabel alloc] init];
    label1.text = @"我是男孩男孩男孩";
    label1.backgroundColor = [UIColor greenColor];
    [self addSubview:label1];
    
    [label1 makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self).offset(100);
        make.left.equalTo(self).offset(10);
    }];
    
    UILabel *label2 = [[UILabel alloc] init];
    label2.text = @"我是女孩女孩女孩女孩女孩女孩";
    label2.backgroundColor = [UIColor greenColor];
    [self addSubview:label2];
    
    [label2 makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.equalTo(label1);
        make.left.equalTo(label1.mas_right).offset(10);
        make.right.equalTo(self).offset(-10);
    }];
    

    实际效果:


    如果想实现label2内容自适应,label1宽度根据label2的宽度自由调节,可以降低label1的CompressionResistance优先级,或者提高label2的CompressionResistance优先级。

    [label1 setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];
    

    或者

    [label2 setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
    

    相关文章

      网友评论

          本文标题:AutoLayout

          本文链接:https://www.haomeiwen.com/subject/zggjextx.html