您的位置:首页 > 移动开发 > IOS开发

万恶的LayoutSubviews

2016-06-26 20:42 776 查看
#万恶的LayoutSubviews

本文主要介绍自己在项目中遇到的关于LayoutSubviews相关的问题, 主要是源于在给约束加动画的时候, viewController的viewWillLayoutSubviews, viewDidLayoutSubviews, 以及view的layoutSubviews会频繁执行的问题, 如果layoutSubviews方法中处理不当, 而动画频繁执行的话, 就会造成界面卡死的情况, 因此, 要处理的特别谨慎.

下面就简单介绍一下, 问题产生的原因:

首先, viewController的生命周期大家应该都很熟悉, 加载完毕的执行过程大概是这样的:

2016-06-26 20:21:28.791 LayoutSubviewsTest[8653:2812815] -[ViewController viewWillAppear:]
2016-06-26 20:21:28.798 LayoutSubviewsTest[8653:2812815] -[ViewController viewWillLayoutSubviews]
2016-06-26 20:21:28.798 LayoutSubviewsTest[8653:2812815] -[ViewController viewDidLayoutSubviews]
2016-06-26 20:21:28.800 LayoutSubviewsTest[8653:2812815] -[ViewController viewWillLayoutSubviews]
2016-06-26 20:21:28.800 LayoutSubviewsTest[8653:2812815] -[ViewController viewDidLayoutSubviews]
2016-06-26 20:21:28.802 LayoutSubviewsTest[8653:2812815] -[ViewController viewDidAppear:]


其实, 我们可以发现viewWillLayoutSubviews和viewDidLayoutSubviews会频繁执行, 其实还有一种情况, viewWillLayoutSubviews和viewDidLayoutSubviews也会执行, 那就是我们在做约束动画的时候, 例如这样:

[UIView animateWithDuration:0.3 animations:^{
self.topConstraint.constant -= 10;
}];


看看执行过程:

2016-06-26 20:25:38.974 LayoutSubviewsTest[8666:2814946] -[ViewController viewWillLayoutSubviews]
2016-06-26 20:25:38.975 LayoutSubviewsTest[8666:2814946] -[ViewController viewDidLayoutSubviews]


我们没执行一次动画, 这两个方法就会执行一次, 这主要是因为约束动画还行后, autoLayout相关机制会重新布局界面, 因此会再次执行这两个方法, 因此, 建议大家不要在这两个方法中处理复杂的问题, 特别是我们在处理动画根据手势变化的时候, 这两个方法执行会特别频繁, 特别是layer相关的处理, 不要放在这两个方法里面执行.

说到这里, 相信大家对问题也是非常清楚了, 希望大家避免这样的错误, 不然很难查找原因所在.

其实, 还有一个方法也会频繁执行, 那就是view的layoutSubviews, 如果做动画的界面中间, 有一些手动添加的子view, 那么就需要特别注意了, 因为我们往往只是关注了viewController的相关方法, 容易忽略view的相关方法, 当约束动画执行的过程中, view的layoutSubviews也是会频繁执行的, 大家可以写demo测试.

之前就是遇到这样一个问题, 那就是在layoutSubviews中处理了layer相关处理, 例如shadow, corner等类似的处理, 在做手势动画的时候, 一旦操作过于频繁, 界面就会卡死, 问题的原因也是找了很久, 这里建议大家使用Xcode的instruments来查找性能相关的问题, 因为可以看到具体耗内存的方法, 使用起来非常方便.

总之, 希望我踩到的这个坑,对大家开发中有所帮助. 建议大家不要在lauoutSubviews相关方法中,处理特别耗内存的问题, 可以再其中获取view正确的frame, 不要处理过多的东西.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS 约束 动画 刷新 卡死