Сделайте снимок вида, не добавляя его на экран
Я пытаюсь загрузить представление из пера, настроить его и сделать его снимок, не добавляя его на экран:
+ (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, так и композитный имеют правильный размер, но пустые, когда я шагаю по коду. Как я могу создать UIImage из вида, загруженного из пера, без добавления вида на экран?
3 ответа
Это кажется немного хакерским, но я попробовал это, и это действительно сделало работу. Если вы загружаете вид из кончика за основным видом, вы можете сделать снимок экрана только этого слоя. До тех пор пока это представление не потребляет много памяти, пользователь никогда не узнает, что это представление было добавлено в супер-представление.
UIGraphicsBeginImageContext(CGSizeMake(catView.frame.size.width, catView.frame.size.height));
CGContextRef context = UIGraphicsGetCurrentContext();
[catView.layer renderInContext:context];
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Так что запускайте этот код после загрузки пера за основным видом. После загрузки вы можете удалить его с помощью `[catView removeFromSuperiew]'
У меня была похожая проблема некоторое время назад, и, насколько я могу судить, невозможно сделать снимок вида, который на самом деле отсутствует на экране. Я создал обходной путь и поместил соответствующее представление, которое я хотел сделать снимок, за пределы текущих границ представления ViewControllers, чтобы вы его не увидели. В этом случае можно было создать действительный снимок. Надеюсь это поможет:)
UIGraphicsBeginImageContext(view.frame.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();