在我们的日常开发中,有时候需要截取手机屏幕生成一张图片,作为分享的图片或者用作他用。比如我最近遇到的一个需求,产品需要手机提供一个功能截取全屏。废话不多说直接上代码。
-
第一步:先截取window,获取window的图片
- (UIImage *)getWindowScreenShot{
UIWindow *window = [UIApplication sharedApplication].delegate.window ;
// 开启图片上下文
UIGraphicsBeginImageContextWithOptions(window.bounds.size, NO, 0);
// 获取当前上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 截图:实际是把layer上面的东西绘制到上下文中
[window.layer renderInContext:ctx];
//iOS7+ 推荐使用的方法,代替上述方法
// [self.view drawViewHierarchyInRect:self.view.frame afterScreenUpdates:YES];
// 获取截图
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
// 关闭图片上下文
UIGraphicsEndImageContext();
// 保存相册
// UIImageWriteToSavedPhotosAlbum(image, NULL, NULL, NULL);
return image;
}
-
截取整个window的图片之后,我们可以发现没有状态栏的信息,接下来,我们需要截取状态栏的图片,不过在这里需要注意的是iOS13之后获取状态栏的方式已经更改,代码如下:
///获取状态栏图片
UIView *statusBarView = nil;
if (@available(iOS 13.0, *)) {
///iOS 13获取状态栏statusBar
UIStatusBarManager *statusBarManager = [UIApplication sharedApplication].keyWindow.windowScene.statusBarManager;
if ([statusBarManager respondsToSelector:@selector(createLocalStatusBar)]) {
UIView *_localStatusBar = [statusBarManager performSelector:@selector(createLocalStatusBar)];
if ([_localStatusBar respondsToSelector:@selector(statusBar)]) {
statusBarView = [_localStatusBar performSelector:@selector(statusBar)];
}
}
} else {
UIWindow *statusBarWindow = [[UIApplication sharedApplication] valueForKey:@"statusBarWindow"];
if (statusBarWindow) {
statusBarView = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
}
}
-
状态栏的图片获取到之后,我们就需要将两张图片合成生成一张图片,得到我们全屏的图片,代码如下 :
UIImage *stateImage = [self doScreenShot:statusBarView];
///获取屏幕图片
UIImage *screenImage = [self getWindowScreenShot];
///合并两张图片
UIGraphicsBeginImageContext(screenImage.size);
[screenImage drawInRect:CGRectMake(0, 0, screenImage.size.width, screenImage.size.height)];
[stateImage drawInRect:CGRectMake(0, 0, stateImage.size.width, stateImage.size.height)];
UIImage *screenshotImage = UIGraphicsGetImageFromCurrentImageContext();
// UIImageWriteToSavedPhotosAlbum(screenshotImage, NULL, NULL, NULL);
UIGraphicsEndImageContext();
这样这个小功能就完成了。