iOS 代码修改Xib约束

作者: Zhui_Do | 来源:发表于2017-04-17 17:14 被阅读461次

    一、修改控件距上、下、左、右的距离,以距右为例:

    1.创建一个Xib的Cell,拖一个按钮到Cell上为按钮添加属性


    添加约束.png

    2.找到距右的属性


    找到距离右边的约束.png
    3.拖线到.h文件当中
    拖线到h文件当中.png

    4.为按钮添加一个点击事件并且在事件当中改变约束的值


    改变约束的值.png

    如果想要渐变的动画效果,把注释部分打开即可(Xib使用UIView动画的方法)先在外面写好目标值,在block内部调用layoutIfNeeded即可。

    二、改变控件宽度的固定值

    同上也是拖线到头文件当中,然后改变NSLayoutConstraint的constant值来改变宽度的大小


    宽度常量改变.png

    三、修改宽度(或高度)比例约束

    1.先为按钮添加一个高度30


    高度.png

    2.设置按钮水平垂直居中


    水平垂直居中.png
    3.设置按钮宽度为父视图宽度的0.3倍
    向父视图拖线.png ![ ![找到宽度比例约束拖线.png](https://img.haomeiwen.com/i5333893/063a380c6a7ca4d3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](https://img.haomeiwen.com/i5333893/792fe02fd5c09c58.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    以上是设置比例的方法,如果想要修改这个宽度,

    在代码中将0.3修改为其他比例,例如(0.6):

    比例属性.png

    可以看到比例属性中有multiplier值为0.3,那是不是修改一下这个值就可以呢,答案是否的。


    不允许修改.png

    不允许直接修改比例的值。
    因为就需求要更改比例值,所以查阅资料后发现大部分都是移除掉这个比例约束,代码重新添加一个新的约束。

    移除添加约束.png
    
        [self.contentView removeConstraint:self.widthMultiplierConstraint];//在父试图上将button的宽度约束删除
        [self.contentView removeConstraint:self.ConstraintNew];
        
        NSLayoutConstraint *myConstraint =[NSLayoutConstraint
                                           constraintWithItem:self.changeButton //子试图
                                           attribute:NSLayoutAttributeWidth //子试图的约束属性
                                           relatedBy:NSLayoutRelationEqual //属性间的关系
                                           toItem:self.contentView//相对于父试图
                                           attribute:NSLayoutAttributeWidth//父试图的约束属性
                                           multiplier:0.6
                                           constant:0.0];// 固定距离
        self.ConstraintNew = myConstraint;
        [self.contentView addConstraint: myConstraint];//为button重新添加一个约束
    

    注意:

    1.这里将新添加的约束纪录下来,是为下次约束改变时移除使用。
    2.如果拖线的代码属性被删除,但是xib上的关联没删掉会导致崩溃。


    Demo效果图.png

    点击可改变约束

    求教:

    本来想做个刷新功能但是发现xib重用这里还有点问题,所以在这里求教一下,有大神的话可以帮忙解答一下。
    1.当有100个cell时,更改了某一个cell上的按钮的宽度,由于重用机制其他的重用cell也会相应变化。所以猜测如果使用xib的cell就要确保每一个cell都要为宽度(其他同理例如lable的text)赋一个新值。这样才不会被重用影响。
    2.因为想做一个右上角的刷新功能,以上三个cell的宽度和距右约束都被改变后,通过点击刷新按钮,如何让当前的cell复原。

    重新注册.png
    这里猜测tableview是否有反注册机制,是不是重新注册一下cell会不会重新加载一下xib但是事实证明并不可以,所以并不能复原更改过的约束。
    所以这里想到的解决办法也是要保证每个cell都要有一个值,用来存储当前的宽度值,一刷新就都赋值为0.
    如果有更好的方法请告知。
    DEMO:https://github.com/Z-hui/ChangeXibConstraint

    相关文章

      网友评论

        本文标题:iOS 代码修改Xib约束

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