约束优先级-iOS


效果图

红色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)