2010-08-04 17 views
6

Ho aggiornato sia il mio iPhone che il mio SDK a iOS 4.0.1 e ora la mia app non funziona allo stesso modo in cui era in esecuzione in iOS 3.x.UIImagePickerController cameraViewTransform funziona in modo diverso in iOS 4

La mia app utilizza UIImagePickerController con una camera personalizzataOverlayView (che sopprimerò in questo post). Il punto principale è che ho bisogno di vedere la fotocamera iphone in modalità a schermo intero. Per andare direttamente al problema, inserirò codice e screenshot per spiegare cosa sta succedendo.

Ho creato un'applicazione basata su visualizzazione utilizzando i progetti Modello XCode denominato "CameraTransform", quindi ho ottenuto due classi: CameraTransformAppDelegate e CameraTransformViewController, ok! Nel metodo di 's il CameraTransformViewControllerviewDidAppear ho messo il seguente codice:

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

L'esecuzione del progetto con/ho ottenuto:

NOTA:

  1. In iOS 3.x ho usato il terzo approccio (entrambi i metodi non commentate) per configurare il selettore, che era spettacolo in modalità a schermo intero, senza la "barra nera" nella parte inferiore .
  2. Ho controllato il valore originale picker.cameraViewTransform (prima di ridimensionarlo) ed è impostato su Identità (come previsto).
  3. Il picker.view.frame è impostato i limiti dello schermo di (0.0, 0.0, 320.0, 480.0)
  4. ho cercato di concatenare una traduzione alla picker.cameraViewTransform (dopo essere scalata), in questo modo: CGAffineTransformTranslate(picker.cameraViewTransform, 0.0, 20.0); e ho capito che c'era qualche parte della "camera view" che era nascosta (forse la sua origine non era la 0.0, 0.0), quindi ho avuto più "camera view" sullo schermo.

Sembra che nel nuovo SDK UIImagePickerController sia cambiato in qualche modo, forse i controlli della fotocamera hanno dimensioni diverse o qualcosa di simile.

Qualcuno ha avuto questo problema?

+0

Ho anche lo stesso problema e grazie per il suggerimento con ridimensionamento. Ho provato a tradurre, ma non sembra esserne influenzato. È davvero strano che cosa sta succedendo qui. Per ora rimango con il ridimensionamento. Se qualcuno ha una risposta adeguata a questo problema, sicuramente lo apprezzeremmo. – Buju

risposta

14

iOS 4.0 magici numero 1936/320 = 6.05, 2592/6,05 = 428, 480-428 = 52 52/(428/2) = 0.24299 + 1 = 1,24299

iOS 3.0 Magic number 1536/320 = 4,8 2048/4,8 = 427 480-427 = 53 53/427 = 0,121412 + 1 = 1,12412

Questo è il rapporto cameraresolution-screenresolution

Per iOS 3.0 la cameraViewTransform viene applicato dall'alto così devi usare tutta l'altezza. Ma in iOS4 viene applicato dal centro del frame in modo da utilizzare la metà dell'altezza. E devi spostare il riquadro in basso (52/2) per lasciare il riquadro al centro.

+0

Ciao Ela, hai qualche idea per la fotocamera iPad solo in modalità orizzontale? – iBhavik

2

Sto trovando la nuova trasformazione di scala per iPhone 4 da ~ 1,25 (anziché ~ 1,12).

Ho trascorso alcuni minuti cercando di capire da dove vengono questi numeri magici - presumo che ci sia una sorta di rapporto tra la risoluzione dello schermo & della risoluzione della fotocamera, ma non riuscivo a capirlo in fretta ...

Se qualcuno lo fa, si prega di inviare una risposta - io odio i numeri magici.

FYI la fotocamera di iPhone 4 è 2592x1936, mentre l'iPhone 3GS è 2048x1536.

4

Non sono sicuro di iOS 3.0 ma per iOS 4.0 la cameraViewTransform viene applicata dal centro del frame.È possibile verificare ciò applicando prima una trasformazione di traduzione.

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

Si può vedere che questo sposta la vista al centro. Quindi applica la trasformazione di ridimensionamento e vedrai che riempie lo schermo.

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

Se la scala trasformare lavora da solo per iOS 3 e società poi la trasformano viene applicato al un diverso punto di ancoraggio come in alto al centro. Dovresti sempre scalare linearmente in entrambe le direzioni o la tua immagine sarà distorta.

3

CGAffineTransformMakeTranslation non funziona direttamente sul cameraViewTransform. Quindi, usa CGAffineTransformScale per applicare CGAffineTransformMakeTranslation.

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