那些年我踩过的坑
来源:互联网 发布:一组时间序列数据 编辑:程序博客网 时间: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
- 那些年我踩过的坑
- 那些年我踩过的坑——Java
- 那些年我踩过的坑(持续更新)
- 我踩过的听过的那些坑
- 码农之记录那些我踩过的坑
- 那些年我准备过的cfa
- 那些年我追过的android
- 那些年我追过的android
- 那些年我追过的android
- 那些年我追过的android
- 那些年,我用过的虚拟主机
- 那些年我写过的代码
- 那些年,我开发过的软件
- 那些年,我使用过的轮子
- 那些年,我培养过的大佬
- 那些年,我开发过的软件
- 那些年我犯过的错
- 那些年我追过的“女孩”
- 关于Ini 文件的读写----一份封装的类
- 新
- Python程序访问北京预约挂号平台
- js获取Enter键按下触发事件
- 使用window.setInterval设置登录前…
- 那些年我踩过的坑
- 查看表的所有字段
- Jquery Ajax 返回的json…
- hibernate集合映射inverse和cascad…
- Spring事务配置的五种方式
- Windows应用程序创建QRCode条码控件QRCode Fontware
- hibernate ...hbm.xml详解
- hibernate .hbm.xml属性
- 等以后