iOS开发笔记之六十五——两种截屏方案的对比
来源:互联网 发布:什么是淘宝直通车图片 编辑:程序博客网 时间:2024/06/05 10:17
******阅读完此文,大概需要3分钟******
业务开发中常常需要截屏生成一张UIView的Image,我们前期就做了一个需要对UIView进行截屏的需求,iOS上截屏的方案有多种,因为我们需要控制图片的分辨率,防止图片过大,所以我们采取了两种方案对UIView进行截屏;
第一种:renderInContext方式,主要代码如下:
- (UIImage *)convertViewToImage:(UIView *)v{ @autoreleasepool { CGSize s = CGSizeMake(v.width, v.height); UIGraphicsBeginImageContextWithOptions(s, NO, 2); [v.layer renderInContext:UIGraphicsGetCurrentContext()]; v.layer.contents = nil; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; }}记住,当我们把UIView的layer渲染完以后,Layer的contents可以提前释放,这样有利于降低内存峰值。这种截屏方案的原理也有介绍:
/** Rendering properties and methods. **/
/* Renders the receiver and its sublayers into 'ctx'. This method
* renders directly from the layer tree. Renders in the coordinate space
* of the layer.
*
* WARNING: currently this method does not implement the full
* CoreAnimation composition model, use with caution. */
renderInContext:方式实际上是通过遍历UIView的layer tree进行渲染,但是它不支持动画的渲染,它的的性能会和layer tree的复杂度直接关联。第二种:UISnapshotting方式,代码如下:
- (UIImage *)convertViewToImage:(UIView *)v{ @autoreleasepool { CGSize s = CGSizeMake(v.width, v.height); UIGraphicsBeginImageContextWithOptions(s, NO, 2); [v drawViewHierarchyInRect:v.frame afterScreenUpdates:YES]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; }}drawViewHierarchyInRect:afterScreenUpdates:的api是苹果基于UIView的扩展,与第一种方式不同,这种方式是直接获取当前屏幕的“快照”,
所以,此种方式的性能与UIView的frame大小直接关联。
以下是我做的几组性能测试数据:
在UIView内容不是很“长”的情况下,第二种方式有内存优势的;但是随着UIView的内容增加,第二种方式会有较大增加;
第二种因为需要等到UIView的update结束才会去capture,所以时间会慢些。
(以上数据会随着你的测试平台和机型不同,仅供参考。)
阅读全文
0 0
- iOS开发笔记之六十五——两种截屏方案的对比
- iOS开发笔记之四十七——多线程场景下的KVO使用参考方案
- iOS开发笔记之六十六——基于Json的页面动态化方案
- Android开发笔记(六十五)多样的菜单
- iOS开发笔记之六十四——基于UIView模块化组件方案
- iOS开发笔记之六——视图的生命周期
- iOS开发笔记之七——应用的生命周期
- iOS开发笔记之十——dealloc的用法
- iOS开发笔记之四十九——iOS开发中一些常用的路径
- QT开发(六十五)——QT样式表编程实例
- (六十五)iOS的socket实现(GCDAsyncSocket)
- iOS开发心得体会——MKN与AFN对比学习笔记
- 剑指offer系列之六十五:机器人的运动范围
- 【iOS-Android开发对比】 之 APP入口
- 【iOS-Android开发对比】之 数据存储
- 【iOS-Android开发对比】 之 APP入口
- iOS开发笔记之三十六——开发中内存管理的使用技巧汇总
- iOS学习笔记-102.多线程01——iOS中多线程的实现方案
- Django-MongoDB的使用
- JAVA ArrayList案例
- Red black tree
- Nginx安装、配置及使用总结
- Red Giant Trapcode Suite 12.0 含注册码
- iOS开发笔记之六十五——两种截屏方案的对比
- 【Eternallyc】qsort排序函数用法
- 函数初了解
- JavaEE----JPA中配置文件persistence.xml
- 密码验证合格程序
- Search for a Range
- Nginx安装、配置及使用总结
- 关键字register static const #define用法总结
- caffe网络结构可视化