2010-08-04 14 views
6

Actualicé mi iPhone y SDK a iOS 4.0.1 y ahora mi aplicación no se ejecuta de la misma manera que se estaba ejecutando en iOS 3.x.UIImagePickerController cameraViewTransform actúa de manera diferente en iOS 4

Mi aplicación usa el UIImagePickerController con una cámara personalizadaOverlayView (que suprimiré en esta publicación). El punto principal es que necesito ver la cámara iphone en modo pantalla completa. Para ir directamente al problema, voy a poner un poco de código y capturas de pantalla para explicar lo que está sucediendo.

Creé una aplicación basada en la vista utilizando los proyectos de plantilla XCode llamados "CameraTransform", así que obtuve dos clases: CameraTransformAppDelegate y CameraTransformViewController, ¡ok! En viewDidAppear método de la CameraTransformViewController 's pongo el siguiente código:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    UIImagePickerController* picker = [[UIImagePickerController alloc] init]; 

    picker.sourceType = UIImagePickerControllerSourceTypeCamera;   
    picker.delegate = self; 

    //[self configurePicker_FirstAttempt:picker]; Use this! 
    //[self configurePicker_SecondAttempt:picker]; Use this too! 

    [self presentModalViewController:picker animated:YES]; 
} 

- (void)configurePicker_FirstAttempt:(UIImagePickerController*) picker { 
    picker.showsCameraControls = NO; 
    picker.navigationBarHidden = YES; 

    // not needed (use defaults) 
    //picker.toolbarHidden = YES; 
    //picker.wantsFullScreenLayout = YES; 
} 

- (void)configurePicker_SecondAttempt:(UIImagePickerController*) picker { 

    // Transform values for full screen support 
    CGFloat cameraTransformX = 1.0; 
    CGFloat cameraTransformY = 1.12412; 

    picker.cameraViewTransform = CGAffineTransformScale(picker.cameraViewTransform, cameraTransformX, cameraTransformY); 
} 

Ejecución del proyecto con/i obtuve:

NOTA:

  1. En iOS 3.x utilicé el tercer enfoque (ambos métodos sin comentar) para configurar el selector, que era espectáculo en el modo de pantalla completa sin la "barra de negro" en la parte inferior .
  2. Inspeccioné el valor original picker.cameraViewTransform (antes de escalarlo) y se establece en Identidad (como se esperaba).
  3. El picker.view.frame se establece en la década de grada de pantalla (0.0, 0.0, 320,0, 480,0)
  4. Traté de concatenar una traducción a la picker.cameraViewTransform (después de haber sido escalado), así: CGAffineTransformTranslate(picker.cameraViewTransform, 0.0, 20.0); y me di cuenta de que había alguna parte de la "vista de cámara" que estaba oculta (tal vez su origen no era el 0.0, 0.0), así que obtuve más "vista de cámara" en la pantalla.

Parece que en el nuevo SDK el UIImagePickerController ha cambiado de alguna manera, tal vez los controles de la cámara tienen diferentes tamaños de algo similar.

¿Alguien ha tenido este problema?

+0

También estoy teniendo el mismo problema y gracias por la punta con escalamiento. Intenté traducir, pero parece que no me afecta. Es realmente extraño lo que está sucediendo aquí. Me quedaré con la escala por ahora. Si alguien tiene una respuesta adecuada a este problema, seguramente lo agradeceríamos. – Buju

Respuesta

14

ios 4.0 mágicas número 1936/320 = 6,05, 2,592/6,05 = 428, 480-428 = 52 52/(428/2) = 0.24299 + 1 = 1,24299

ios 3.0 Número mágico 1536/320 = 4,8 2048/4,8 = 427 480-427 = 53 53/427 = 0,121412 + 1 = 1,12412

Esa es la relación cameraresolution-screenresolution

Para iOS 3.0 se aplica la cameraViewTransform desde la parte superior por lo tienes que usar toda la altura. Pero en iOS4 se aplica desde el centro del marco, por lo que debe usar la mitad de la altura. Y debe mover el marco hacia abajo (52/2) para dejar el marco en el centro.

+0

Hola Ela, ¿tienes alguna idea para la cámara iPad solo en modo horizontal? – iBhavik

2

Estoy descubriendo que la nueva transformación de escala para el iPhone 4 es ~ 1.25 (en lugar de ~ 1.12).

Pasé unos minutos tratando de averiguar de dónde vienen estos números mágicos - Supongo que hay algún tipo de relación entre la resolución de la pantalla & la resolución de la cámara, pero no pude entenderlo a toda prisa ...

Si alguien lo hace, por favor, envíe una respuesta - Odio los números mágicos.

FYI la cámara res del iPhone 4 es 2592x1936, mientras que el iPhone 3GS es 2048x1536.

4

No estoy seguro acerca de iOS 3.0 pero para iOS 4.0 la cámara ViewTransform se aplica desde el centro del encuadre.Puede verificar esto aplicando primero una transformación de traducción.

CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 27.0); 
imagePickerController.cameraViewTransform = translate; 

Puede ver que esto mueve la vista al centro. A continuación, aplique la transformación de escala y verá que llena la pantalla.

CGAffineTransform scale = CGAffineTransformScale(translate, 1.125, 1.125); 
imagePickerController.cameraViewTransform = scale; 

Si el escalado transformar trabaja solo para iOS 3 y compañía a continuación, se aplica a la de un punto de anclaje diferente, como la parte superior central de la transformada. Siempre debe escalar linealmente en ambas direcciones o su imagen se sesgará.

3

CGAffineTransformMakeTranslation no funcionará directamente en cameraViewTransform. Por lo tanto, use CGAffineTransformScale para aplicar CGAffineTransformMakeTranslation.

float yOffset = 44.0; 
CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, yOffset); 
self.cameraFeed.cameraViewTransform = CGAffineTransformScale(translate, 1, 1); 
Cuestiones relacionadas