UIImagePickerController Problema de tamaño de vista de camera

Estoy construyendo una aplicación con el UIImagePickerController y una superposition personalizada. Lo que hace es comparar dos imágenes (antes de la image y después de la image). Estoy utilizando una superposition personalizada con la image anterior al tomar la foto posterior (por favor, consulte la image adjunta).

iPhone 5 – ios7 introduzca la descripción de la imagen aquí

iPhone 4 – iOS7 (Al tomar la image) introduzca la descripción de la imagen aquí

iPhone 4 – iOS 7 (Después de tomar la foto) introduzca la descripción de la imagen aquí

Vea la diferencia de tamaño entre la vista de camera iPhone 4 y iPhone 5.

La aplicación funciona bien con el tamaño de pantalla del iPhone 5 (Both ios 6 y ios7). Pero el tamaño de pantalla del iPhone 4 / 4s, funciona bien SOLO con iOS6. El problema es con el iPhone 4 / 4s (ios7 SOLO), la vista de la camera toma la pantalla completa. Eso significa que puedes ver el tamaño de la vista de la camera del iPhone 5 ~ 320 * 427 (iOS 6 y iOS 7) Tamaño de la vista de la camera del iPhone 4 ~ 320 * 427 (iOS 6) PERO el tamaño de la vista de la camera del iPhone 4 ~ 320 * 480 (iOS 7).

Después de que se toma la image, se ajusta al tamaño real de 320 * 427. Debido a este problema, no puedo alinearme antes de la image con la vista de la camera en el iPhone 4 iOS7 (porque chilla a 320 * 480).

¿Alguien se enfrenta a este extraño problema? Probé casi todo, pero no tuve suerte. Cualquier idea por favor ???

Este es mi código de pieza para cargar la vista de la camera con la function personalizada antes de la superposition de fotos.

- (void)loadCameraWithImage { if (!isLoadedOnce) { isLoadedOnce = YES; UIImagePickerController *cameraView = [[UIImagePickerController alloc] init]; cameraView.sourceType = UIImagePickerControllerSourceTypeCamera; cameraView.wantsFullScreenLayout = NO; if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { [self setEdgesForExtendedLayout:UIRectEdgeNone]; } // crop before image UIImage *imgTmpCropped = [self imageByCropping:imgBefore toRect:CGRectMake(0, 0, imgBefore.size.width/2, imgBefore.size.height)]; UIImage *overleyImage = [[UIImage alloc] initWithCGImage: imgTmpCropped.CGImage scale: [UIScreen mainScreen].scale orientation: UIImageOrientationDownMirronetworking]; UIImageView *crosshairView; UIImageView *beforeView; CGFloat screenHieght = [UIScreen mainScreen].bounds.size.height; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){ //overleyImage = [UIImage imageNamed:@"overlay_ipad.png"]; crosshairView = [[UIImageView alloc] initWithImage:overleyImage]; crosshairView.frame = CGRectMake(0, 0, 768, 1024); [crosshairView setUserInteractionEnabled:YES]; crosshairView.backgroundColor = [UIColor clearColor]; beforeView = [[UIImageView alloc] initWithImage:overleyImage]; beforeView.frame = CGRectMake(0, 0, 384, 1024); beforeView.alpha = 0.5; beforeView.contentMode = UIViewContentModeScaleAspectFill; } else { //overleyImage = [UIImage imageNamed:@"overleyImageAfter.png"]; crosshairView = [[UIImageView alloc] init]; beforeView = [[UIImageView alloc] initWithImage:overleyImage]; if(screenHieght>500){ crosshairView.frame = CGRectMake(0, 60, 320, 480); beforeView.frame = CGRectMake(0, 70, 160, 427); } else{ if([[[UIDevice currentDevice] systemVersion] floatValue] <7.0){ crosshairView.frame = CGRectMake(0, 0, 320, 480); beforeView.frame = CGRectMake(0, 0, 160, 427); } else{ crosshairView.frame = CGRectMake(0, 0, 320, 480); beforeView.frame = CGRectMake(0, 0, 160, 480); } } [crosshairView setUserInteractionEnabled:YES]; crosshairView.backgroundColor = [UIColor clearColor]; beforeView.alpha = 0.5; beforeView.contentMode = UIViewContentModeScaleToFill; } //[crosshairView addSubview:beforeView]; //set our custom overlay view cameraView.cameraOverlayView = beforeView; cameraView.delegate = (id)self; cameraView.showsCameraControls = YES; cameraView.navigationBarHidden = YES; cameraView.toolbarHidden = YES; [cameraView setHidesBottomBarWhenPushed:YES]; [self.view.window.rootViewController presentViewController:cameraView animated:YES completion:nil]; isLoadedOnce = NO; } 

}

TL; DR

La vista previa de la camera tiene la misma relación de aspecto en cada dispositivo (4: 3), las pantallas no. Asume que la vista previa tendrá esa relación de aspecto específica y que se colocará en una position específica en la pantalla. Dibuja tu superposition dentro de esa área.

Más time :

Nos enfrentamos al mismo problema. (Nuestro caso de uso es tomar fotos de tarjetas de crédito con una superposition con el mismo tamaño que una tarjeta). El problema principal es que las proporciones de la vista previa de la camera son siempre iguales (4: 3) en cada dispositivo, pero diferentes teléfonos tienen diferentes proporciones de pantalla (iPhone 4s vs iPhone 5, por ejemplo), por lo que la vista previa debe ajustarse de manera diferente y eso hace que poner una superposition y recorte muy difícil.

Nuestra solución fue (el código es algo desorderado y hacky, lo siento):

  // Adjust camera preview to be a little bit more centenetworking instead of adjusted to the top CGSize screenSize = [[UIScreen mainScreen] bounds].size; float cameraAspectRatio = 4.0 / 3.0; float imageHeight = screenSize.width * cameraAspectRatio; float verticalAdjustment; if (screenSize.height - imageHeight <= 54.0f) { verticalAdjustment = 0; } else { verticalAdjustment = (screenSize.height - imageHeight) / 2.0f; verticalAdjustment /= 2.0f; // A little bit upper than centenetworking } CGAffineTransform transform = self.cameraController.cameraViewTransform; transform.ty += verticalAdjustment; self.cameraController.cameraViewTransform = transform; CGRect previewFrame = CGRectMake(0, verticalAdjustment, screenSize.width, imageHeight); CardPhotoView *overlayView = [[CardPhotoView alloc] initWithFrame:CGRectMake(0, 0, screenSize.width, screenSize.height) widthPercentageOfCamera:self.widthPercentageOfCamera previewFrame:previewFrame]; self.overlayView = overlayView; self.overlayView.delegate = self; self.overlayView.useViewport = YES; [self.overlayView setCameraReady:NO]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cameraIsReady:) name:AVCaptureSessionDidStartRunningNotification object:nil]; self.cameraController.showsCameraControls = NO; self.cameraController.navigationBarHidden = YES; self.cameraController.toolbarHidden = YES; self.cameraController.cameraOverlayView = self.overlayView; [self presentViewController:self.cameraController animated:NO completion:nil]; 

Explicación :

self.cameraController es un UIImagePickerController . CardPhotoView es una subclass de vista que dibuja la superposition, toma el marco de previsualización para saber exactamente dónde se colocará la previsualización (algunos dispositivos tendrán barras negras arriba y abajo, otras no). También se necesita un porcentaje de ancho para agregar un pequeño relleno a la window de recorte. Además, hemos ocultado todos los controles pnetworkingeterminados de la camera y hemos implementado algunos botones que harán el trabajo por nosotros. Esos botones se agregan en la class CardPhotoView y se dibujan teniendo en count dónde está el marco de vista previa.