文档章节

iOS开发技巧(系列九:UIView截屏)

召唤攻城狮
 召唤攻城狮
发布于 2014/05/05 20:04
字数 460
阅读 8705
收藏 5

本博客翻译自苹果问答中心,原文链接在此

问:在iOS7以及以后的版本中,我怎样对一个UIView对象或者其子类对象截屏,并将截取的内容以UIImage的形式存储?

答:自iOS7开始,UIView类提供了一个方法-drawViewHierarchyInRect:afterScreenUpdates:,它允许你截取一个UIView或者其子类中的内容,并且以位图的形式(bitmap)保存到UIImage中,包括UIKit,Quartz,OpenGL ES,SpriteKit等等。在iOS6以及更早的版本中,怎样对UIView截屏从本质来说取决于绘制技术(drawing technique)。

看下面的代码示例,在iOS7及以上更高版本中,使用-drawViewHierarchyInRect:afterScreenUpdates,截取一个View中内容,

#pragma mark - Private method

- (UIImage *)snapshot:(UIView *)view

{

    UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0);

    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    

    return image;

}

上面是翻译的内容,说一说我是怎样在代码中具体使用的吧。

假设self.view上面有一个sourceImageView和一个destinationImageView,我想截取sourceImageView视图的内容,保存在UIImage中,然后赋值给destinationImageView.image,代码如下所示(注:使用arc、xib编码,很多细节不要在意,嘿嘿),

- (IBAction)captureButtonClicked:(id)sender

{

    self.destinationImageView.image = [self snapshot:self.sourceImageView];

}

#pragma mark - Private method

- (UIImage *)snapshot:(UIView *)view

{

    UIGraphicsBeginImageContextWithOptions(view.bounds.size,YES,0);

    [view drawHierarchyInRect:view.bounds afterScreenUpdates:YES];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return image;

}

很简单的代码,也没什么困难的地方。这里,我是将UIImageView对象sourceImageView作为参数传入,是比较简单的情况;有的时候我们需要在应用程序中获取当前self.view中的内容,可以将self.view作为参数传入。

本人建了一个ios交流群188647173,有兴趣的可以加群进来相互交流。

© 著作权归作者所有

共有 人打赏支持
召唤攻城狮
粉丝 184
博文 53
码字总数 49671
作品 0
玉林
加载中

评论(2)

召唤攻城狮
召唤攻城狮

引用来自“i0s”的评论

想要全屏的截屏,为什么传入 self.view 截出来的事不包含 status bar?其他的像 navigation bar 都有。怎么让它包含状态栏?

我之前没注意到这个问题,有空看看解决方案
i0s
i0s
想要全屏的截屏,为什么传入 self.view 截出来的事不包含 status bar?其他的像 navigation bar 都有。怎么让它包含状态栏?
iOS--OC--图片拉伸和尺寸变换,图片简单处理

图片拉伸和尺寸变换 图片拉伸 : - (UIImage )stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight; 一般 leftCapWidth = imageWidth .5f, top......

丶雨凡
2015/03/26
0
0
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊
05/26
0
0
iOS UIView Block 动画- (基础动画, 关键帧动画, 动画组)

UIView本身对于基本动画和关键帧动画、转场动画都有相应的封装,在对动画细节没有特殊要求的情况下使用起来也要简单的多 1、UIView Block 基础动画 ,转场动画+ 缩放 2、关键帧动画(里面加上...

朝雨晚风
05/31
0
0
iOS一些代码的取巧写法总结(一)

一、 字典(NSDictionary)和JSON字符串(NSString)之间互转 二、打开摄像机作为背景 三、打开背光灯 四、状态栏和导航栏一些设置 五、切回app时、会有闪现、闪现一次主屏幕的现象 六、[UIAppl...

朝雨晚风
2016/12/05
0
0
iOS 11开发教程(十二)iOS11应用视图始祖——UIView

iOS 11开发教程(十二)iOS11应用视图始祖——UIView 在Swift中,NSObject是所有类的根类。同样在UIKit框架(UIKit框架为iOS应用程序提供界面对象和控制器)中,也存在一个如此神奇的类UIVie...

大学霸
2017/11/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

搬瓦工镜像站bwh1.net被DNS污染,国内打不开搬瓦工官网

今天下午(2018年10月17日),继搬瓦工主域名bandwagonhost.com被污染后,这个国内的镜像地址bwh1.net也被墙了。那么目前应该怎么访问搬瓦工官网呢? 消息来源:搬瓦工优惠网->搬瓦工镜像站b...

flyzy2005
10分钟前
0
0
SpringBoot自动配置

本篇介绍下,如何通过springboot的自动配置,将公司项目内的依赖jar,不需要扫描路径,依赖jar的情况下,就能将jar内配置了@configuration注解的类,创建到IOC里面 介绍下开发环境 JDK版本1.8 spr...

贺小五
今天
3
0
命令行新建Maven多项目

参考地址 # DgroupId 可以理解为包名# DartifactId 可以理解为项目名mvn archetype:generate -DgroupId=cn.modfun -DartifactId=scaffold -DarchetypeArtifactId=maven-archetype-quickst......

阿白
今天
1
0
OSChina 周四乱弹 —— 上帝对我单身年限的惩罚越来越长了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享张卫健的单曲《身体健康》 《身体健康》- 张卫健 手机党少年们想听歌,请使劲儿戳(这里) 昨天是重阳节咯, 可惜小小编辑总是晚...

小小编辑
今天
12
1
django rest framework 外键序列化方法与问题总结

django rest framework 外键序列化方法与问题总结 当借口中需要出现一对多关系的时候,我们可以用rest_framwork的序列化功能来处理,代码如下. # models.pyfrom django.db import modelscl...

_Change_
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部