UIViewController中截图的第一个好时机在哪里
Where is the first good moment to take a screenshot in UIViewController
我想在加载视图时截取我的视图。我用这个方法:
- (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
如何截屏?
试试这个:
- (UIImage *)screenshot {
UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, [UIScreen mainScreen].scale);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
您也可以试试UIView
的snapshotViewAfterScreenUpdates
方法:
[self.view snapshotViewAfterScreenUpdates:YES];
试试这个
自 iOS 7 以来添加了新的 API,这应该提供获取快照的有效方法
snapshotViewAfterScreenUpdates:
将视图呈现为具有 unmodifiable
内容
的 UIView
resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets
:同样的事情,但是 resizable insets
drawViewHierarchyInRect:afterScreenUpdates:
如果您也需要绘制所有子视图(如标签、按钮...),同样如此
希望对您有所帮助。
我想在加载视图时截取我的视图。我用这个方法:
- (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
如何截屏?
试试这个:
- (UIImage *)screenshot {
UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, [UIScreen mainScreen].scale);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
您也可以试试UIView
的snapshotViewAfterScreenUpdates
方法:
[self.view snapshotViewAfterScreenUpdates:YES];
试试这个
自 iOS 7 以来添加了新的 API,这应该提供获取快照的有效方法
snapshotViewAfterScreenUpdates:
将视图呈现为具有 unmodifiable
内容
UIView
resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets
:同样的事情,但是 resizable insets
drawViewHierarchyInRect:afterScreenUpdates:
如果您也需要绘制所有子视图(如标签、按钮...),同样如此
希望对您有所帮助。