iOS中的画面截图

在开发中有时会需要做截屏操作,那么该如何做到截屏呢?
我们先来看一下在iOS 7 之前是如何做的,这也是在经常看到的做法:

1
2
3
4
5
6
7
8
- (UIImage *)imageOfCurrentContent
{
UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, [UIScreen mainScreen].scale);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return viewImage;
}

以上就是我经常见到的获取截屏的方法。但是在iOS 7之后通常不是用这种方式。原因是iOS 7之后UIView有新的API drawViewHierarchyInRect:afterScreenUpdates: 。新的API与通过CALayer绘图的差别是,iOS 7 之后的UI设计大量使用半透明毛玻璃效果的view,而使用CALayer截出的图片无法抓到这部分,按苹果的说法,新的API可以抓到无论是UIKit、Quartz、OpenGL ES、SpriteKit 等系统级别产生的画面。

1
2
3
4
5
6
7
- (UIImage *)snapshot:(UIView *)view {
UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0);
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}

iOS 7之后除了这个方法之外UIView还提供了另外两个截屏的方法:

1
2
3
- (nullable UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates;
- (nullable UIView *)resizableSnapshotViewFromRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates withCapInsets:(UIEdgeInsets)capInsets;

而且UIScreen也提供了一个方法:

1
- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates;

这三个方法都是直接返回UIView对象,如果你在寻找截屏的view,用这些方法中的一个会更有效。

参考:
1.KKBOX iOS/Mac OS X 基本開發教材
2.官方链接