1. 尽量不要在子类中重写sizeTofit
在项目中踩了这样一个坑,就在在子类中重写了sizeToFit,并且在sizeTofit中进行了layout,形成了死循环, 在iOS5下必crash。
简单的描述 有两个view,A_view, A_subView
在A_view中
- (void)layoutSubviews{
[super layoutSubviews];
[A_subView sizeToFit];
......
}
在A_subView中
- (void)layoutSubviews{
[super layoutSubviews];
把一堆按钮按瀑布流布局好.......
}
- (void)sizeToFit{
[self setNeedsLayout];
[self layoutIfNeeded];
[super sizeToFit];
此处一堆计算,为了算出一个合适的高度
self.bounds.size.height = 计算出的高度
}
在A_view中,执行[A_subView sizeToFit]时,会调用A_subView的sizeToFit,但是在此方法中,前两条语句执行了立即重绘,会调用subView中的layoutView,之后在sizeTofit的最后一句话self.bounds会导致本view的大小发生变化,致使其superView触发了layoutSubviews,但在这个方法中又调用了sizeTofit,形成了一个闭环。关键点就在于子view的大小发生变化时触发了父view的layoutSubviews,但是在layoutSubviews又对子View的大小做了处理,避免此问题发生的方法是不要重写sizeTofit(苹果也不建议这么做),而应该改用sizeThatFit,并且不要调用立即刷新,应该把subView中layoutSubviews方法中的布局信息抽出来,计算出一个合适的高度,return 之。
更改方法:在A_subView中
- (void)layoutSubviews{
[super layoutSubviews];
.......
}
- (CGSize)sizeThatFits:(CGSize)size{
[super sizeThatFits];
CGSize newSize = size;
把一堆按钮按瀑布流布局好,本view的宽度已知且固定;
此处一堆计算,为了算出一个合适的高度;
newSize.height = 计算出的高度;
return newSize;
}