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 中可以观察到相同的问题。所以 viewDidLoadviewDidAppear 都太早了。我在 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-JTViewToImage project also usefull.

您也可以试试UIViewsnapshotViewAfterScreenUpdates方法:

[self.view snapshotViewAfterScreenUpdates:YES];

试试这个

自 iOS 7 以来添加了新的 API,这应该提供获取快照的有效方法

snapshotViewAfterScreenUpdates: 将视图呈现为具有 unmodifiable 内容

UIView

resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets :同样的事情,但是 resizable insets

drawViewHierarchyInRect:afterScreenUpdates: 

如果您也需要绘制所有子视图(如标签、按钮...),同样如此

希望对您有所帮助。