iOS开发技巧(系列九:UIView截屏)
iOS开发技巧(系列九:UIView截屏)
召唤攻城狮 发表于4年前
iOS开发技巧(系列九:UIView截屏)
  • 发表于 4年前
  • 阅读 8506
  • 收藏 5
  • 点赞 1
  • 评论 2

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 看苹果的文档,在问答中心中有人提出了这个问题,苹果官方给了问题答案,本人只是翻译一下。

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

问:在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,有兴趣的可以加群进来相互交流。

标签: ios7 uiview截屏
共有 人打赏支持
粉丝 185
博文 53
码字总数 49671
评论 (2)
i0s
想要全屏的截屏,为什么传入 self.view 截出来的事不包含 status bar?其他的像 navigation bar 都有。怎么让它包含状态栏?
召唤攻城狮

引用来自“i0s”的评论

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

我之前没注意到这个问题,有空看看解决方案
×
召唤攻城狮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: