一、修改控件距上、下、左、右的距离,以距右为例:
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
不允许直接修改比例的值。
因为就需求要更改比例值,所以查阅资料后发现大部分都是移除掉这个比例约束,代码重新添加一个新的约束。
[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复原。
这里猜测tableview是否有反注册机制,是不是重新注册一下cell会不会重新加载一下xib但是事实证明并不可以,所以并不能复原更改过的约束。
所以这里想到的解决办法也是要保证每个cell都要有一个值,用来存储当前的宽度值,一刷新就都赋值为0.
如果有更好的方法请告知。
DEMO:https://github.com/Z-hui/ChangeXibConstraint
网友评论