我希望在加载视图时制作我的视图的屏幕截图。我用这个方法:
- (UIImage *)screenshot {
UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0.0f);
if( [self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)] ) {
[self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
} else {
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
}
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return screenshot;
}
screenshot
方法经过测试并运行良好。我在viewDidLoad
的UIViewController中使用该方法。问题是结果是灰色图像!这意味着视图未在viewDidLoad
方法中加载。在viewDidAppear
中可以观察到同样的问题。因此viewDidLoad
和viewDidAppear
太早了。我已在viewDidLoad
方法中找到了解决方法:
__weak MyUIViewController *weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^() {
UIImage* image = [weakSelf.view screenshot]
// do sth with image...
});
如何制作没有dispatach_async
的屏幕截图?
答案 0 :(得分:1)
试试这个:
- (UIImage *)screenshot {
UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, [UIScreen mainScreen].scale);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
答案 1 :(得分:1)
您还可以尝试snapshotViewAfterScreenUpdates
的{{1}}方法:
UIView
答案 2 :(得分:0)
试试这个
自iOS 7以来添加了新的API,它应该提供有效的快照获取方式
snapshotViewAfterScreenUpdates:
将视图呈现为UIView
内容为unmodifiable
resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets
:同样的事情,但resizable insets
drawViewHierarchyInRect:afterScreenUpdates:
如果你也需要绘制所有子视图(比如标签,按钮......)
希望它有所帮助。