在不将视图添加到屏幕的情况下拍摄视图的快照



我正在尝试从笔尖加载视图,对其进行配置,并拍摄快照,而不将其添加到屏幕:

+ (void)composeFromNibWithImage:(UIImage*)catImage completion:(CompletionBlock)completion {
    NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"CatNib" owner:nil options:nil];
    CatView *catView = [nibContents firstObject];
    //here, catView is the correct size from the nib, but is blank if inspected with the debugger
    catView.catImageView.image = catImage;
    catView.furButton.selected = YES;    
    UIImage *composite = [UIImage snapshot:catView];
    completion(composite);
}

其中快照是典型的:

+ (UIImage *)snapshot:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0);
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

然而,catView和composite的大小都是正确的,但在我逐步完成代码时都是空白的。如何在不将视图添加到屏幕的情况下,从笔尖加载的视图创建UIImage?

我不久前也遇到过类似的问题,据我所知,不可能拍摄视图的快照,这实际上不是屏幕上的。我创建了一个变通方法,并将我想要快照的相关视图放置在当前ViewControllers视图边界之外,这样你就看不到它了。在这种情况下,可以创建一个有效的快照。希望这有帮助:)

这感觉有点粗糙,但我试过了,它确实完成了任务。如果你从主视图后面的笔尖加载视图,你可以只截取该层的屏幕截图。只要它不是内存密集型视图,用户就永远不会知道该视图已添加到超级视图中。

UIGraphicsBeginImageContext(CGSizeMake(catView.frame.size.width, catView.frame.size.height));
CGContextRef context = UIGraphicsGetCurrentContext();
[catView.layer renderInContext:context];
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

因此,在主视图后面加载笔尖后运行此代码。加载后,您可以使用`[catView removeFromSuperiew]'将其删除

    UIGraphicsBeginImageContext(view.frame.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

相关内容

  • 没有找到相关文章

最新更新