Vul*_*kan 5 iphone objective-c uiview uiimage ios
我使用此方法拍摄快照:
UIView *snapshotView = [someView snapshotAfterScreenUpdates:NO];
Run Code Online (Sandbox Code Playgroud)
这给了我一个可以玩的UIView.
但是,我需要它的UIImage而不是UIView.
这是我用于将UIView转换为UIImage的方法:
- (UIImage *)snapshotOfView:(UIView *)view
{
UIImage *snapshot;
UIGraphicsBeginImageContext(view.frame.size);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
snapshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return snapshot;
}
Run Code Online (Sandbox Code Playgroud)
它不起作用,快照是一个空白的UIImage,因为snapshotView没有呈现.
显而易见的事情是直接拍摄视图的快照,而不是以UIView的形式拍摄快照然后转换它.
显而易见的方法的问题是我使用的WKWebView有一个巨大的错误,不允许你截取屏幕截图.这是真的,我甚至报告了这个错误,他们说他们正试图修复它.
那么,如何在不渲染的情况下拍摄snapshotView的快照(UIImage)呢?
由于接受者的回答对我不起作用(一直UIGraphicsGetImageFromCurrentImageContext()
返回nil
),我为 iOS10+找到了不同的解决方案:
let renderer = UIGraphicsImageRenderer(size: view.bounds.size)
let image = renderer.image { _ in view.drawHierarchy(in: view.bounds, afterScreenUpdates: true) }
Run Code Online (Sandbox Code Playgroud)
PS 你可能想在渲染之前调用updateConstraintsIfNeeded()
和layoutIfNeeded()
drawViewHierarchyInRect
会为你工作.您可以直接在WKWebView上使用它.
Apple Technical Q&A有一些有用的细节.我也在这里回答一个稍微不同的问题.
我在UIView的类别中使用它:
@implementation UIView (ImageSnapshot)
- (UIImage*)imageSnapshot {
UIGraphicsBeginImageContextWithOptions(self.bounds.size,
YES, self.contentScaleFactor);
[self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
@end
Run Code Online (Sandbox Code Playgroud)
我不知道你用'显而易见的方法'是什么意思 - 但我已经在WKWebView上对它进行了测试并且它有效.
归档时间: |
|
查看次数: |
4892 次 |
最近记录: |