拍摄视图快照而不将其添加到屏幕
Take a snapshot of view without adding it to the screen
我正在尝试从 nib 加载一个视图,对其进行配置,然后拍摄它的快照,而不是将它添加到屏幕上:
+ (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 的大小都正确,但在我逐步执行代码时为空白。如何从从 nib 加载的视图创建 UIImage,而不将视图添加到屏幕?
这感觉有点老套,但我试过了,它确实完成了工作。如果您从主视图后面的笔尖加载视图,您可以截取该层的屏幕截图。只要不是内存密集型视图,用户永远不会知道该视图被添加到超级视图中。
UIGraphicsBeginImageContext(CGSizeMake(catView.frame.size.width, catView.frame.size.height));
CGContextRef context = UIGraphicsGetCurrentContext();
[catView.layer renderInContext:context];
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
因此 运行 在您将 nib 加载到主视图后面后,这段代码。加载后,您可以使用 `[catView removeFromSuperiew]'
将其删除
我前段时间遇到过类似的问题,据我所知,无法拍摄视图的快照,那实际上 在 屏幕上.我创建了一个解决方法,并将我想要快照的相关视图放置在当前 ViewControllers 视图边界之外,这样您就不会看到它。在这种情况下,可以创建有效的快照。希望这有帮助:)
UIGraphicsBeginImageContext(view.frame.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
我正在尝试从 nib 加载一个视图,对其进行配置,然后拍摄它的快照,而不是将它添加到屏幕上:
+ (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 的大小都正确,但在我逐步执行代码时为空白。如何从从 nib 加载的视图创建 UIImage,而不将视图添加到屏幕?
这感觉有点老套,但我试过了,它确实完成了工作。如果您从主视图后面的笔尖加载视图,您可以截取该层的屏幕截图。只要不是内存密集型视图,用户永远不会知道该视图被添加到超级视图中。
UIGraphicsBeginImageContext(CGSizeMake(catView.frame.size.width, catView.frame.size.height));
CGContextRef context = UIGraphicsGetCurrentContext();
[catView.layer renderInContext:context];
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
因此 运行 在您将 nib 加载到主视图后面后,这段代码。加载后,您可以使用 `[catView removeFromSuperiew]'
将其删除我前段时间遇到过类似的问题,据我所知,无法拍摄视图的快照,那实际上 在 屏幕上.我创建了一个解决方法,并将我想要快照的相关视图放置在当前 ViewControllers 视图边界之外,这样您就不会看到它。在这种情况下,可以创建有效的快照。希望这有帮助:)
UIGraphicsBeginImageContext(view.frame.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();