约束优先级-iOS

作者: 纳木错_grace | 来源:发表于2018-04-15 15:20 被阅读237次

    效果图

    红色view底部先开始距离绿色view顶部50,在没有绿色view的时候,红色view距离蓝色view顶部50。


    约束

    红色view底部有两个约束,但是优先级数值不一样,如果数值一样的话,会报冲突。这样当一个约束移除后(绿色view移除),低优先级的约束就生效。


    对于tableViewCell来说,不能靠移除一个view来让低优先级的约束起作用,因为cell是复用的,移除cell上的子view的话,之后的布局会错误。我们可以通过改变优先级约束的数值。注意:如果要在运行时改变约束优先级的值,约束的优先级不能设置为1000(Required)。

    Terminating app due to uncaught exception 'NSInternalInconsistencyException',
     reason: 'Mutating a priority from required to not on an installed constraint (or vice-versa) is not supported.  You passed priority 100 and the existing priority was 1000
    
    

    崩溃问题回答
    上边的报错原因是你已经设置了优先级是必须的,不能用其他优先级替换。我们可以将两个优先级都设置成非必须的,只是数值大小不同,就可以。

    奇偶约束.png
    xib约束粉色view和黄色view,当偶数行时,粉色view右边距离父视图右边距20,当为奇数行时,粉色view右边距离黄色view的左边20。
    - (void)setIndex:(NSInteger)index
    {
        _index = index;
        if (index % 2 == 0) {
            self.lineNumLabel.text = @"我是偶数行";
            self.toSuperView.priority = 100;//这里的优先级的数值可以改,只要一个比另一个数值小就可以,但是不能为1000。
            self.toYellowView.priority = 999;
        }else{
            self.lineNumLabel.text = @"我是奇数行";
            self.toYellowView.priority = 100;
            self.toSuperView.priority = 999;
        }
    }
    

    ContentHuggingPriority(抗拉伸优先级)和ContentCompressionResistancePriority(抗压缩优先级)



    如图,想要实现偶数行尽量让绿色label显示完全,奇数行红色label显示完全。我们可以通过改变两个label的抗压缩和抗拉伸的优先级来实现这样的效果。
    - (void)setIndex:(NSInteger)index
    {
        _index = index;
        if (index % 2==0) {//尽量将绿色的label显示完全
            //redlable在可拉伸和可压缩的的优先级都降低到比greenlabel低,正常的值是抗拉伸的值为251,抗压缩的值为750
            [self.redLabel setContentHuggingPriority:250 forAxis:UILayoutConstraintAxisHorizontal];
            [self.redLabel setContentCompressionResistancePriority:749 forAxis:UILayoutConstraintAxisHorizontal];
            
            [self.greenLabel setContentHuggingPriority:251 forAxis:UILayoutConstraintAxisHorizontal];
            [self.greenLabel setContentCompressionResistancePriority:750 forAxis:UILayoutConstraintAxisHorizontal];
            
        }else{//尽量将红色的label显示完全
            [self.redLabel setContentHuggingPriority:251 forAxis:UILayoutConstraintAxisHorizontal];
            [self.redLabel setContentCompressionResistancePriority:750 forAxis:UILayoutConstraintAxisHorizontal];
            
            [self.greenLabel setContentHuggingPriority:250 forAxis:UILayoutConstraintAxisHorizontal];
            [self.greenLabel setContentCompressionResistancePriority:749 forAxis:UILayoutConstraintAxisHorizontal];
        }
    }
    

    如图中黄色框圈起来的红色label没有被压缩到了正好将绿色label的内容显示完全了。如果绿色的label的内容再长一些,而红色label的宽度约束有没有设置的情况下,是可以将红色label压缩到看不到的。在这里我是设置了红色label的宽度的约束大于等于50


    相关文章

      网友评论

        本文标题:约束优先级-iOS

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