无法在 NewPad 9.3.5 上将 UIView 转换为 UIImage

Posted

技术标签:

【中文标题】无法在 NewPad 9.3.5 上将 UIView 转换为 UIImage【英文标题】:Can not convert UIView to UIImage on NewPad 9.3.5 【发布时间】:2017-03-18 11:10:48 【问题描述】:

使用- (nullable UIView *)resizableSnapshotViewFromRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates withCapInsets:(UIEdgeInsets)从包含AVCaptureVideoPreviewLayer的UIView中进行快照,然后我想将结果(UIView *)转换为UIImage,并显示它,但是UIImage一直是空的。

CGRect frame = CGRectMake(0, 0, 768, 893);
UIView *photo = [self.cameraView resizableSnapshotViewFromRect:frame afterScreenUpdates:YES withCapInsets:UIEdgeInsetsZero];

UIGraphicsBeginImageContextWithOptions(photo.bounds.size, NO, [[UIScreen mainScreen] scale]);
[photo drawViewHierarchyInRect:photo.bounds afterScreenUpdates:YES];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

UIImageView * iv = [[UIImageView alloc] initWithImage:image];
[iv setFrame:CGRectMake(0, 0, image.size.width, image.size.height)];
[self addSubview:iv];

CALayer * layer = [iv layer];
layer.borderWidth = 2.0f;
layer.borderColor = [[UIColor orangeColor] CGColor];

有人知道为什么不能得到正确的 UIImage 吗?

Xcode Version 8.2.1 (8C1002) MacOS Sierra 10.12.3(16D32) Deployment Target 9.3 iPad ios 9.3.5

【问题讨论】:

【参考方案1】:

我不知道这个的Objective-C-version,但是尝试自己将它转换为Obj-C,并添加这段代码:

let context = UIGraphicsGetCurrentContext()
photo.layer.render(in:context!)

在后面加上

[photo drawViewHierarchyInRect:photo.bounds afterScreenUpdates:YES];

但之前

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

【讨论】:

[photo.layer renderInContext:UIGraphicsGetCurrentContext()]; 不起作用 @leezhm 嗯..我认为它会工作..你确定你的 UIView 已经被绘制了吗?你在那个绘图函数中发送afterScreenUpdates:YES,你知道这段代码是什么意思吗?我不......也许它会等待绘制视图,直到屏幕准备好,但您的其余代码会立即出现。尝试将其更改为NO 尝试是和否,它不起作用!我的项目是一个iPad App,发现这个话题github.com/jfradj/ScreenshotIssue***.com/questions/25432222/…【参考方案2】:

使用以下方法(未经测试):

- (UIImage *)renderViewToImage:(UIView *)view

    UIImage* image = nil;

    UIGraphicsBeginImageContext(view.bounds.size);          
    [view.layer renderInContext: UIGraphicsGetCurrentContext()];        
    image = UIGraphicsGetImageFromCurrentImageContext();            
    UIGraphicsEndImageContext();

    return image

然后调用:

UIImage *img = [self renderViewToImage:photo]

您可能希望将其设为UIView 的类别。

【讨论】:

我暂时没有机会测试。尝试view.bounds.size 而不是view.frame.size。并让我们知道发生了什么“不起作用”。 没用!我的项目是一个 iPad 应用程序,我发现了这个 github.com/jfradj/ScreenshotIssue

以上是关于无法在 NewPad 9.3.5 上将 UIView 转换为 UIImage的主要内容,如果未能解决你的问题,请参考以下文章

无法在 wordpress 上将我的 html 编辑为 wordpress 主题

我无法在颤振 Firestore 上将字段设置为 NULL

无法在 Windows 上将 OSG 与 GDAL 一起使用

无法在 python 3 上将复杂转换为浮点数

无法在 NaiveBayes Spark 示例上将字符串转换为浮点数

无法在 iOS 15 上将本机应用程序连接到后端