万恶的LayoutSubviews
2016-06-26 20:42
776 查看
#万恶的LayoutSubviews
本文主要介绍自己在项目中遇到的关于LayoutSubviews相关的问题, 主要是源于在给约束加动画的时候, viewController的viewWillLayoutSubviews, viewDidLayoutSubviews, 以及view的layoutSubviews会频繁执行的问题, 如果layoutSubviews方法中处理不当, 而动画频繁执行的话, 就会造成界面卡死的情况, 因此, 要处理的特别谨慎.
下面就简单介绍一下, 问题产生的原因:
首先, viewController的生命周期大家应该都很熟悉, 加载完毕的执行过程大概是这样的:
其实, 我们可以发现viewWillLayoutSubviews和viewDidLayoutSubviews会频繁执行, 其实还有一种情况, viewWillLayoutSubviews和viewDidLayoutSubviews也会执行, 那就是我们在做约束动画的时候, 例如这样:
看看执行过程:
我们没执行一次动画, 这两个方法就会执行一次, 这主要是因为约束动画还行后, autoLayout相关机制会重新布局界面, 因此会再次执行这两个方法, 因此, 建议大家不要在这两个方法中处理复杂的问题, 特别是我们在处理动画根据手势变化的时候, 这两个方法执行会特别频繁, 特别是layer相关的处理, 不要放在这两个方法里面执行.
说到这里, 相信大家对问题也是非常清楚了, 希望大家避免这样的错误, 不然很难查找原因所在.
其实, 还有一个方法也会频繁执行, 那就是view的layoutSubviews, 如果做动画的界面中间, 有一些手动添加的子view, 那么就需要特别注意了, 因为我们往往只是关注了viewController的相关方法, 容易忽略view的相关方法, 当约束动画执行的过程中, view的layoutSubviews也是会频繁执行的, 大家可以写demo测试.
之前就是遇到这样一个问题, 那就是在layoutSubviews中处理了layer相关处理, 例如shadow, corner等类似的处理, 在做手势动画的时候, 一旦操作过于频繁, 界面就会卡死, 问题的原因也是找了很久, 这里建议大家使用Xcode的instruments来查找性能相关的问题, 因为可以看到具体耗内存的方法, 使用起来非常方便.
总之, 希望我踩到的这个坑,对大家开发中有所帮助. 建议大家不要在lauoutSubviews相关方法中,处理特别耗内存的问题, 可以再其中获取view正确的frame, 不要处理过多的东西.
本文主要介绍自己在项目中遇到的关于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, 不要处理过多的东西.
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Gifski:一个跨平台的高质量 GIF 编码器
- 模仿动画的放大缩小容器
- SQLserver删除某数据库中所有表实现思路
- C#实现刷新桌面的方法
- jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
- Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
- Android实现定制返回按钮动画效果的方法
- android编程之下拉刷新实现方法分析
- Android中ViewFlipper的使用及设置动画效果实例详解
- jQuery实现美观的多级动画效果菜单代码
- php判断GIF图片是否为动画的方法
- 使用JavaScript刷新网页的方法
- window.location.reload 刷新使用分析(去对话框)