那些年我踩过的坑

来源:互联网 发布:一组时间序列数据 编辑:程序博客网 时间:2024/04/29 23:49

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;}
0 0
原创粉丝点击