Tomar una instantánea de la vista sin agregarla a la pantalla

Estoy intentando cargar una vista desde una punta, configurarla y tomar una instantánea, sin agregarla a la pantalla:

+ (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); } 

donde la instantánea es la típica:

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

Sin embargo, catView y el compuesto tienen el tamaño correcto, pero en blanco cuando paso por el código. ¿Cómo puedo crear un UIImage desde una vista cargada desde una punta sin agregar la vista a la pantalla?

Esto se siente un poco hacky, pero lo intenté y hace el trabajo. Si carga la vista desde su plumín detrás de la vista principal, puede tomar una captura de pantalla de esa capa. Mientras no se trate de una vista intensiva de memory, el usuario nunca sabría que la vista se agregó a la super visión.

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

Por lo tanto, ejecute este código después de cargar su plumín detrás de su vista principal. Una vez cargado, puede eliminarlo con `[catView removeFromSuperiew] '

Tuve un problema similar hace un time, y por lo que puedo decir, no es posible tomar una instantánea de una vista, eso no está realmente en la pantalla. Creé una solución temporal y coloqué la vista en cuestión, que quería hacer una instantánea, fuera de los límites de vista actuales de ViewControllers, para que no la vea. En este caso, fue posible crear una instantánea válida. Espero que esto ayude 🙂

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