美文网首页
关于动态布局约束的一点记录

关于动态布局约束的一点记录

作者: 床前明月_光 | 来源:发表于2019-04-04 10:55 被阅读0次
    1.动态修改约束的优先级

    优先级可根据数字设置范围 0~1000; 系统框架提供

    • required(1000)、
    • defaultHigh(750)、
    • defaultLow(250)、
    • fittingSizeLevel(50)

    设置约束时,默认的优先值就为required(1000),所以我们在等界面运行起来之后再把它改为其他的值时会报错,例如:1000 改为 250 或 把 250改为 1000
    会报如下错误:

    Mutating a priority from required to not on an installed constraint (or vice-versa) is not supported.  You passed priority 250 and the existing priority was 1000.'
    

    所以我们只能在一开始初始化约束的时候就把优先值设置为1000 以下就可以随便修改约束优先值为1000以下的任何正数值。

    2. 触发约束变化包括
    • Activating或Deactivating
    • 设置constant或priority
    • 添加和删除视图

    遇到约束变化会重新计算layout,获取新值后会call它的superview.setNeedsLayout()

    3.关于使用第三方框架 SnapKit 或 masonry

    使用 updateConstraints 方法时一般只是在原有的约束上面修改常常量值, 不可以变更约束的对象, 约束的属性, 约束的优先值

    使用 remakeConstraints 时,应注意更本视图相关的约束全部会移除后再重新添加你想要的约束, 包括该视图约束相关的子视图约束也会被清除

    当我们想拿到 约束时,只能用一个为外部的变量获取,例如:

     var sizeConstraint: Constraint?
     var topConstraint: Constraint?
     var leftConstraint: Constraint?
            
      greenView.snp.makeConstraints { (maker) in
         sizeConstraint =  maker.size.equalTo(CGSize(width: 100, height: 100)).constraint
         topConstraint =  maker.top.equalTo(blueView.snp.bottom).offset(10).priority(750).constraint
         leftConstraint =  maker.left.equalToSuperview().offset(10).constraint
       }
    
    

    这样子我们就可以修改约束的对象,优先值,或者属性了

    4、可以自适应的控件
    • Hugging priority让这些控件不要大于某个设定的值,默认优先级为250。例如:三个 UIlaebl 水平布局, 当他们的文本总长度超出了屏幕的宽度时,你想其中的一个 Label 的文案优先展示出来时,可以把 Hugging priority 设的比其他两个优先级高
    • Content Compression Resistance就是让控件不要小于某个设定的值,默认优先级为750

    相关文章

      网友评论

          本文标题:关于动态布局约束的一点记录

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