ZBarReaderView UIView Problema de orientación de la camera

Actualmente estoy desarrollando una aplicación para iPad que usa ZBarSDK para leer códigos QR.

Estoy usando ZBarReaderView (NO UIViewController ), así que estoy mostrando la camera frontal en una UIView que se dibuja usando CGRect (ver el código a continuación).

Mi problema es que la camera aparece de lado en la vista. La aplicación iPad SOLO se desarrollará para trabajar en modo horizontal.

Cuando la UIView aparece ahora, la image está del lado y no estoy seguro de cómo solucionarlo. Intenté usar CGAffineTransform que cambia un poco el ángulo de manera exitosa, pero ¿cómo se manejará esto si el iPad se voltea hacia el otro lado?

Vi algunas otras publicaciones sobre este problema similar, pero ninguna resolución me funcionó. Vale la pena señalar que estoy usando IOS6 y recuerde que estoy usando ZBarReaderView , por lo que supportedOrientationsMask NO está disponible.

Quiero que el usuario vea la vista de la camera en la position vertical independientemente de si el paisaje está a la izquierda o a la derecha. Sin embargo, ahora, independientemente de la forma en que se haya girado, el video está hacia un lado (así puedo verme a 90 grados hacia un lado). La UIView no cambia en absoluto cuando la pantalla está activada. Estoy un poco perdido.

Código:

 - (void) viewDidAppear: (BOOL) animated { ZBarReaderView * readerView = [ZBarReaderView new]; ZBarImageScanner * scanner = [ZBarImageScanner new]; [scanner setSymbology: ZBAR_I25 config: ZBAR_CFG_ENABLE to: 0]; [readerView initWithImageScanner:scanner]; readerView.readerDelegate = self; readerView.tracksSymbols = YES; readerView.frame = CGRectMake(20,220,230,230); readerView.torchMode = 0; readerView.device = [self frontFacingCameraIfAvailable]; [readerView start]; [self.view addSubview: readerView]; } -(void)relocateReaderPopover:(UIInterfaceOrientation)toInterfaceOrientation { if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) { readerView.previewTransform = CGAffineTransformMakeRotation(M_PI_2); } else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { readerView.previewTransform = CGAffineTransformMakeRotation(-M_PI_2); } else if (toInterfaceOrientation== UIInterfaceOrientationPortraitUpsideDown) { readerView.previewTransform = CGAffineTransformMakeRotation(M_PI); } else { readerView.previewTransform = CGAffineTransformIdentity; } } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) { return YES; } else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight) { return YES; } else { return NO; } } - (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) orient duration: (NSTimeInterval) duration { if (orient == UIInterfaceOrientationLandscapeLeft) { [readerView willRotateToInterfaceOrientation: orient duration: duration]; } if (orient == UIInterfaceOrientationLandscapeRight) { [readerView willRotateToInterfaceOrientation: orient duration: duration]; } } - (BOOL)shouldAutorotate { UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation]; if (orientation == UIInterfaceOrientationLandscapeLeft) { return YES; } else if (orientation == UIInterfaceOrientationLandscapeRight) { return YES; } else { return NO; } } -(NSUInteger) supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } 

¡Recibí el mismo problema y lo resolví con simpatía!

Solo necesitaba llamar:

 [reader willRotateToInterfaceOrientation: toInterfaceOrientation duration: duration]; 

dentro del WillRotate … del controller de vista que contiene el ZbarReaderView.

De acuerdo, ahora tengo la orientación trabajando. No tengo idea de por qué funciona ahora, pero aquí está el código final para el lector. Ver parte:

 readerView = [ZBarReaderView new]; ZBarImageScanner * scanner = [ZBarImageScanner new]; [scanner setSymbology: ZBAR_I25 config: ZBAR_CFG_ENABLE to: 0]; [readerView initWithImageScanner:scanner]; readerView.readerDelegate = self; readerView.tracksSymbols = YES; readerView.frame = CGRectMake(20,220,230,230); readerView.torchMode = 0; readerView.device = [self frontFacingCameraIfAvailable]; [self relocateReaderPopover:[self interfaceOrientation]]; [readerView start]; [self.view addSubview: readerView]; 

Fíjate que la única diferencia real es esta línea:

 ZBarReaderView * readerView = [ZBarReaderView new]; 

Cambiar esa línea ha corregido el problema de orientación inicial. No sé por qué, pero lo hizo. Ahora solo necesito arreglar las cosas de rotation para si el usuario rota el iPad.

Esto funcionó bien para mí:

 // ADD: present a barcode reader that scans from the camera feed ZBarReaderViewController *reader = [ZBarReaderViewController new]; reader.readerDelegate = self; //reader.supportedOrientationsMask = ZBarOrientationMaskAll; ScanOverlay *overlayController = [[ScanOverlay alloc] initWithNibName:@"ScanOverlay" bundle:nil]; reader.cameraOverlayView = overlayController.view; ZBarImageScanner *scanner = reader.scanner; // TODO: (optional) additional reader configuration here reader.supportedOrientationsMask = ZBarOrientationMask(UIInterfaceOrientationLandscapeRight||UIInterfaceOrientationLandscapeLeft); reader.wantsFullScreenLayout = YES; reader.showsZBarControls = NO; //If we don't set this to NO, the overlay may not display at all reader.tracksSymbols = YES; 

// Para admitir la orientación horizontal

 UIInterfaceOrientation orientation = [UIApplication shanetworkingApplication].statusBarOrientation; if (UIDeviceOrientationLandscapeLeft == orientation) { //Rotate 90 reader.cameraViewTransform = CGAffineTransformMakeRotation (3*M_PI/2.0); } else if (UIDeviceOrientationLandscapeRight == orientation) { //Rotate 270 reader.cameraViewTransform = CGAffineTransformMakeRotation (M_PI/2.0); }