本博客翻译自苹果问答中心,原文。
问:在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
{
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
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,有兴趣的可以加群进来相互交流。