2010-02-24 12 views
5

Tengo una aplicación que se presenta utilizando un UITableView. La interfaz ocupa más que solo la pantalla, por lo que hay un área en la que se puede desplazar. Me gustaría obtener algunas capturas de pantalla de toda la vista (incluido el área no visible) para utilizarla en la documentación y solicitar comentarios de mi cliente.¿Cómo tomar una captura de pantalla de iPhone de toda la vista, incluidas las partes fuera de la pantalla?

¿Existe una forma programática de obtener una imagen de toda la vista? No creo que haya una manera en el dispositivo para hacer esto, pero tal vez exista.

Respuesta

6

Solo pegué un código que utilicé en mi aplicación. Dibuja una vista de una imagen (potencialmente escalada). tal vez usted podría desplazarse programmaticaly la mesa y unir las imágenes en el final o algo similar:

+ (UIImage *)captureView: (UIView *)view inSize: (CGSize)size 
{ 
    UIGraphicsBeginImageContext(size); 
    CGSize viewSize = view.frame.size; 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextScaleCTM(context, size.width/viewSize.width, size.height/viewSize.height); 

    [view.layer renderInContext: UIGraphicsGetCurrentContext()]; 

    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return viewImage; 
} 

creo que sirve

+2

Sí, funciona como un campeón si en lugar de hacerlo escalar, simplemente usa el tamaño de la vista, y cuando crea el UITableView, lo hace lo suficientemente alto para todas las celdas lógicas en la vista y el ancho estándar. – Bearddo

1

Con una vista de tabla en el iphone, no hay un área "extra" para desplazarse. La vista de tabla es tan grande como la pantalla y, a medida que se despliegan nuevas celdas, se crean a demanda, mientras que las celdas antiguas que se desplazan fuera de la pantalla se desasignan.

+0

debida nota, sin embargo, que en realidad no resuelve mi problema de conseguir una captura de pantalla de toda la interfaz (sin múltiples disparos y luego empalmar juntos). – Bearddo

+1

Está diciendo que obtienes la captura de pantalla de toda la interfaz. Las partes de la tabla fuera de la pantalla son simplemente lógicas. No tienen ninguna manifestación visual en absoluto. Una tabla no es como una vista de desplazamiento que solo muestra parte de una vista más grande. Con una mesa, lo que ves es lo que existe. Cada vez que se desplaza por la mesa, se reconstruye a sí mismo. Hasta que se desplace a una posición fuera de la pantalla, esa posición no existe visualmente. – TechZen

+0

@TechZen Sí, entiendo que se basa sobre la marcha, lo que quiero es una captura de pantalla de toda la interfaz como si se dibujaran todas las celdas lógicas (con tanto espacio como eso lleva). – Bearddo

1

As Jasarien said, a UITableView no tiene elementos fuera de pantalla. Es solo una ilusión de escenario que crea la apariencia de un solo elemento largo.

Si desea crear una imagen de tabla larga (es decir, fuera de la pantalla), should take screenshots of the table en diferentes posiciones de desplazamiento y luego Photoshop/GIMP/insertar-gráficos-app las capturas de pantalla en un gráfico largo.

4

En realidad se puede desplazar la tableview. El siguiente código funciona perfecto en mi aplicación. Pero puede tomar un blanco para hacer la captura de pantalla. Puede consultar el this para ver si alguien mejoró.

//viewController is your UITableViewController 
UIGraphicsBeginImageContext(viewController.tableView.contentSize); 
[viewController.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
[viewController.tableView.layer renderInContext:UIGraphicsGetCurrentContext()]; 

int rows = [viewController.tableView numberOfRowsInSection:0]; 
int numberofRowsInView = 7; 
for (int i =0; i < rows/numberofRowsInView; i++) { 
    [viewController.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:(i+1)*numberofRowsInView inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
    [viewController.tableView.layer renderInContext:UIGraphicsGetCurrentContext()]; 

} 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+0

gracias, funciona. – Alex

1

realizar una captura de toda la vista de tabla y no sólo celdas visibles. Este enfoque no requiere desplazarse por la vista de tabla y tomar muchas capturas de pantalla y unirlas.

Funciona bien con el pie de página y el encabezado de la vista de tabla.

CGRect frame = _tableView.frame; 
frame.size.height = _tableView.contentSize.height;//the most important line 
_tableView.frame = frame; 

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

NSData * data = UIImagePNGRepresentation(image); 
+0

Enfoque perfecto. Esto cambia la altura del marco de tableView antes de tomar la captura de pantalla, para que no tenga que preocuparse por el desplazamiento. Tenga en cuenta que tendrá que manipular el alto del marco si tiene una barra de navegación visible. – Jeff

+0

Una edición: después de UIGraphicsEndImageContext() ;, debe restaurar el marco de tableView a lo que originalmente era, o se desordenará el desplazamiento. – Jeff

Cuestiones relacionadas