在UIViewController中截取屏幕截图的第一个好时机在哪里

时间:2015-06-18 07:18:59

标签: ios objective-c 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的屏幕截图?

3 个答案:

答案 0 :(得分:1)

试试这个:

- (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.

答案 1 :(得分:1)

您还可以尝试snapshotViewAfterScreenUpdates的{​​{1}}方法:

UIView

答案 2 :(得分:0)

试试这个

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

snapshotViewAfterScreenUpdates:将视图呈现为UIView内容为unmodifiable

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

drawViewHierarchyInRect:afterScreenUpdates: 

如果你也需要绘制所有子视图(比如标签,按钮......)

希望它有所帮助。