Convierta los contenidos de UIWebview en un UIImage cuando la vista web sea más grande que la pantalla

Muy similar a esta pregunta (y también esta respuesta ), estoy tratando de hacer un UIImage desde una vista web. Hasta ahora estoy usando el código sugerido en la respuesta, específicamente:

UIGraphicsBeginImageContext(webview.bounds.size); [webview.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 

Sin embargo, cuando los contenidos de la vista web son más grandes que la pantalla, las imágenes resultantes no están completas y tienen parches faltantes. ¿Alguna idea sobre cómo solucionar este problema?

Tengo la respuesta:

Debe establecer el marco de la Vista Web en el tamaño de contenido completo justo antes de crear la image. Después de esto, simplemente establezca el tamaño en el origen:

 + (UIImage *) imageFromWebView:(UIWebView *)view { // tempframe to reset view size after image was created CGRect tmpFrame = view.frame; // set new Frame CGRect aFrame = view.frame; aFrame.size.height = [view sizeThatFits:[[UIScreen mainScreen] bounds].size].height; view.frame = aFrame; // do image magic UIGraphicsBeginImageContext([view sizeThatFits:[[UIScreen mainScreen] bounds].size]); CGContextRef resizedContext = UIGraphicsGetCurrentContext(); [view.layer renderInContext:resizedContext]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // reset Frame of view to origin view.frame = tmpFrame; return image; } 

La respuesta de DR está bien. Lo único que falta es tener en count la escala de la pantalla. Lo he corregido en mi versión Swift y funciona bien para mí.

 extension UIWebView{ func snapshotForCompletePage() -> UIImage { // tempframe to reset view size after image was created let tmpFrame: CGRect = self.frame // set full size Frame var fullSizeFrame: CGRect = self.frame fullSizeFrame.size.height = self.scrollView.contentSize.height self.frame = fullSizeFrame // here the image magic begins UIGraphicsBeginImageContextWithOptions(fullSizeFrame.size, false, UIScreen.mainScreen().scale) let resizedContext: CGContextRef = UIGraphicsGetCurrentContext()! self.layer.renderInContext(resizedContext) let image: UIImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() // reset Frame of view to origin self.frame = tmpFrame return image } } 

Creo que esto podría ayudar

 UIGraphicsBeginImageContext([webView sizeThatFits:[[UIScreen mainScreen] bounds].size]]); 

@ La respuesta de Jibeex me funcionó. Pero tuve que agregar el siguiente código

  fullSizeFrame.size.width = self.scrollView.contentSize.width 

abajo

  fullSizeFrame.size.height = self.scrollView.contentSize.height 

para que funcione por completo. Escribo como respuesta porque no tengo la suficiente reputación para comentar.