使用多个 CALayer 捕获 UIVIew 的屏幕截图显示白色背景,同时将图像保存在图库中

Capturing Screenshot of UIVIew with multiple CALayers displays white background while save image in gallery

我有一个 UIView,其中包含不同大小的不同 CALayer。

当我尝试将 UIView 作为图像保存到画廊时,它失去了透明度:

我的代码是:

- (UIImage *) imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, [UIScreen mainScreen].scale);
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

//获取图像

 UIImage *img=[self imageWithView:MainView];
 UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);

注意:当我调试代码时,它显示透明图像,但当我在画廊中看到它显示白色背景

我试过你的代码。您可以尝试以下实现:

- (void)viewDidLoad {
    [super viewDidLoad];

    UIView *tmpView = [UIView new];
    tmpView.frame = self.view.bounds;
    tmpView.backgroundColor = [UIColor clearColor];
    [self.view addSubview:tmpView];

    UIImage *img = [self imageWithView:tmpView];
    [self saveInJPGFormat:img];
    [self saveInPNGFormat:img];
}

- (void)saveInJPGFormat:(UIImage *)image {
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
}

- (void)saveInPNGFormat:(UIImage *)image {
    NSData* imageData =  UIImagePNGRepresentation(image);
    UIImage* pngImage = [UIImage imageWithData:imageData];
    UIImageWriteToSavedPhotosAlbum(pngImage, nil, nil, nil);
}

- (UIImage *) imageWithView:(UIView *)view {
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, [UIScreen mainScreen].scale);
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

您的方法以 JPG 格式保存到相机胶卷。 JPG 无法保留 alpha 通道。 取自 的第二种方法将图像保存为 PNG。我可以打开它,我可以看到图像(alpha 通道已保存)。

顺便说一句:ofc 这是非常肮脏和快速的代码。实际上,您应该为这些方法在 UIImage 上做一个分类。同时保持 MVC 和视图和图层坚持故事板或分离 UIView 子类。

来自我的相册的图片: 预览屏幕,确保它是空的:

所以该方法有效。