iOS 屏幕截图

2,534 阅读1分钟

  在我们的日常开发中,有时候需要截取手机屏幕生成一张图片,作为分享的图片或者用作他用。比如我最近遇到的一个需求,产品需要手机提供一个功能截取全屏。废话不多说直接上代码。

  • 第一步:先截取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();

这样这个小功能就完成了。