2009-08-17 10 views
6

Busco una manera de capturar una captura de pantalla en el iPhone con la barra de estado superior incluido, actualmente estoy usando el siguiente código:Capturar pantalla de iPhone con barra de estado incluida?

UIGraphicsBeginImageContext(self.view.bounds.size); //self.view.window.frame.size 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 

El código anterior se mostrará una captura de pantalla del iPhone UIView pero hace no incluye la barra de estado superior (en su lugar solo hay un espacio en blanco de 20 píxeles).

Respuesta

3

Puede obtener todo el contenido de la pantalla llamando a la API privada UIGetScreenImage. Vea mi previous answer a similar question para más detalles.

+0

He leído sobre este API privada función antes, tengo curiosidad por saber si Apple aceptará la aplicación para el iPhone para usar una función API privada? –

+3

Los sentimientos varían según el uso de las API privadas. Aquí está mi opinión: 1) El uso de API privadas va en contra de las reglas de Apple y es una de las (enloquecedoramente) pocas formas obvias en que tu aplicación puede ser rechazada o retirada de la tienda; pero ... 2) Algo tan simple como una captura de pantalla puede volar bajo el radar y no ser notado por un reviwer; y aún así ... 3) Apple podría cambiar esa API en cualquier momento en el futuro, con cualquier versión, de cualquier manera, por cualquier motivo, sin previo aviso. Siento que cualquier uso de API privadas se está configurando para un dolor de cabeza de soporte y creando la posibilidad de una mala experiencia de usuario. –

+0

En este caso particular, no creo que exista un gran riesgo si la función tiene acceso de manera dinámica y se explican las fallas: la aplicación puede simplemente volver a una captura de pantalla utilizando el método estándar. Sin embargo, su implementación particular en mi respuesta utiliza enlaces estáticos, y eso es un ejercicio para el lector. – rpetrich

1

A partir del 8 de octubre de 2009, el uso de UIGetScreenImage hizo que mi aplicación fuera rechazada. :(No aconsejaría usarlo. Creo que Apple está tratando de limpiar todas las aplicaciones y hacer que se ajusten a los nuevos 3.x OS/API. Estoy buscando una alternativa. Si alguien tiene alguna sugerencia, el video API?

1

en lugar de utilizar la API privada, ¿por qué no hacer que todo el UIWindow en el contexto de imagen? podría ser suficiente para reemplazar self.view con self.view.window en el código.

también puede obtener la ventana actual (s) como una propiedad de la instancia [UIApplication sharedApplication]. Es posible que la barra de estado esté en una capa de ventana separada y tal vez tenga que procesar las ventanas en orden.

Algo como esto:

UIGraphicsBeginImageContext(self.view.window.frame.size); 
for (UIWindow *window in [[UIApplication sharedApplication] windows]) { 
    [window.layer renderInContext:UIGraphicsGetCurrentContext()]; 
} 
UIImage *screenshotImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 

En cualquier caso, probablemente no necesite recurrir a una API privada.

+0

Desafortunadamente, el uso de la propiedad keyWindow de los resultados de UIA en el mismo problema - barra de estado negra. Aparentemente no hay forma (legal) de capturar la pantalla completa. –

+0

La barra de estado está en una ventana separada. Puede recorrer la propiedad 'windows' de UIApplication y representarlos en la misma imagen, en orden. – benzado

+0

¿Alguna manera de decir cuál es la barra de estado? –

11

A partir de iOS 7, usted puede hacer esto sin el uso de APIs privadas usando

UIView *screenshotView = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO]; 

Véase mi respuesta a esta pregunta:

Moving status bar in iOS 7

Cuestiones relacionadas