ios开发中masonry的使用心得
去年做项目时用到一个第三方自动布局的框架——Masonry,期间碰到过一些问题,现在在此总结一下:
1.添加约束后APP崩溃的问题:(所有问题原因都能归根结底到子view没有成功加到父view上就设置约束)
①如果是ios7及ios7以下的系统,崩溃的大部分之前在网络上查过,主要元原因说“主要是在equalTo的对象指到了父视图的父视图或者父视图同级的子视图上造成的”,后来将约束equalto全都指向了父view或者同级别的view上,之后的确奏效;
②如果是ios7以上的系统,系统崩溃的可能原因:a)还没有将子view添加到父view上就开始添加约束,这样view完全找不到自己的约束根基在哪里,必然会崩;b)之前遇到过一个设置navigationbar的leftbuttonitem和rightbuttonitem,但是我在viewdidload()方法直接设置约束就会引发崩溃,原因可能是在跳转该界面时(页面push进来时)navigationbar还没有加载完,此时就开始添加buttonitem并设置约束,所以解决方案是延时设置navigationbar的样式:
dispatch_after(time, dispatch_get_main_queue(), ^{
[XXX];
});
2.添加约束不起作用的问题:
①设置的约束不能确定控件的唯一位置,除非有需要自适应高度的控件,需要其他地方重新控制高度;
②取消掉所有控件的use autolayout 和autoresize subviews属性,因为这是系统自带的autolayout所以需要去掉才能发挥masonry的用处;
3)在一些跳转的界面,有的控件还没有加载完就设置约束肯定不会起作用的,例如之前我用MJRefresh进行下拉上拉刷新时,页面刚跳转进来时tableview还没有加载完就设置了header,此时header的约束肯定不能成功,所以解决方案也是采用延时处理;
*后放一下从网络上摘取的几个刷新布局的方法,给自己mark一下:
setNeedsLayout:告知页面需要更新,但是不会立刻开始更新。执行后会立刻调用layoutSubviews。
layoutIfNeeded:告知页面布局立刻更新。所以一般都会和setNeedsLayout一起使用。如果希望立刻生成新的frame需要调用此方法,利用这点一般布局动画可以在更新布局后直接使用这个方法让动画生效。
layoutSubviews:系统重写布局
setNeedsUpdateConstraints:告知需要更新约束,但是不会立刻开始
updateConstraintsIfNeeded:告知立刻更新约束
updateConstraints:系统更新约束
这只是目前刚用masonry不久的一点小心得,如果不对,请各位大神指正啊(*^__^*)