2011-10-19 15 views
7

En mi aplicación, quiero que el usuario pueda tomar una foto o usar una de la biblioteca de fotos. Cuando el usuario hace clic en el botón que hice que aparezca una alerta, el usuario puede elegir entre tomar una foto nueva o una de la biblioteca de fotos. Aquí está el código que he utilizado:¿Por qué la interfaz de mi cámara actúa de manera extraña cuando uso UIImagePickerController?

- (void)PictureAlert:(id)sender { 

    UIAlertView *AlertDialog; 

    // Setting up AlertDialog. 
    AlertDialog = [[UIAlertView alloc] initWithTitle:nil 
              message:nil 
              delegate:self 
            cancelButtonTitle:@"Cancel" 
            otherButtonTitles:@"Choose From Library", @"Take New Picture", nil]; 

    [AlertDialog show]; } 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 

    NSString *ButtonTitle = [alertView buttonTitleAtIndex:buttonIndex]; 

    if ([ButtonTitle isEqualToString:@"Choose From Library"]) { 

     if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { 

      // Pick photo. 
      UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
      picker.delegate = self; 
      picker.allowsEditing = YES; 
      picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; 

      [self presentModalViewController:picker animated:YES]; 


     } else if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { 

      // Setting up AlertDialog. 
      UIAlertView *AlertDialog; 

      AlertDialog = [[UIAlertView alloc] initWithTitle:@"Error accessing photo library" 
                message:@"Device does not support a photo library" 
                delegate:self 
              cancelButtonTitle:@"Dismiss" 
              otherButtonTitles:nil]; 

      [AlertDialog show]; 

     } 


    } else if ([ButtonTitle isEqualToString:@"Take New Picture"]) { 

     if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { 

      // Take new photo. 
      UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
      picker.delegate = self; 
      picker.allowsEditing = YES; 
      picker.wantsFullScreenLayout = YES; 
      picker.sourceType = UIImagePickerControllerSourceTypeCamera; 

      [self presentModalViewController:picker animated:YES]; 


     } else if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { 

      // Setting up AlertDialog. 
      UIAlertView *AlertDialog; 

      AlertDialog = [[UIAlertView alloc] initWithTitle:@"Error accessing camera" 
                message:@"Device does not support a camera" 
                delegate:self 
              cancelButtonTitle:@"Dismiss" 
              otherButtonTitles:nil]; 

      [AlertDialog show]; 

     } 

    } 

} 

El problema es que si el usuario quiere hacer una nueva foto de la interfaz de la cámara aparece, y luego, si se gira el dispositivo de la interfaz se parece a esto: enter image description here

Y luego, cuando el usuario gira de nuevo, de repente se ve así: enter image description here

un pequeño problema adicional es que la cámara tarda mucho tiempo en cargar.

Cualquier idea sería apreciada :)

+0

tengo exactamente este problema. – nicholjs

Respuesta

0

En algún momento de su pasado si está utilizando una vieja generación de iPhone que tiene sistema operativo actual, por ejemplo, va a ser sometido iPhone 3G y actualizar sus IOS para iOS5 continuación algunas de las aplicaciones Si usted se instala puede comportarse de manera diferente, puede verificar su aplicación en otro dispositivo para rectificar su problema.

+0

Pero tengo un iPhone 4 ... ¿todavía debería ser un problema? –

+0

bien, entonces prueba este tutorial proporcionado por apple para hacer tus cosas de la cámara. http://stackoverflow.com/questions/7763459/save-the-captured-image-with-the-overlay-image-to-the-photoalbum-in-iphone/7763483#7763483 – Ballu

0

Asegúrese de establecer la jerarquía del controlador de vista, con mainWindow.rootViewController y [vc addChildViewController:]. Esto propaga la información de orientación hasta donde la necesita.

+0

parece que está haciendo esto en el código que publicó con presentModelViewController. – nicholjs

1

Algunas cosas que usted puede tener en cuenta:

  1. Al establecer la propiedad wantsFullScreenLayout a YES hará que el fin de ignorar la barra de estado. Pero como está utilizando los controles predeterminados de la cámara, la barra de estado se oculta automáticamente. Esta es la causa más probable del área gris de 20 píxeles en la parte inferior de la imagen.

  2. Los controles predeterminados de la cámara están diseñados para estar en modo retrato solamente. Dado que su primera imagen parece que de alguna manera ha girado la pantalla, debe buscar en su código (probablemente shouldAutoRotate) y ver por qué está girando la vista de esa manera. Esto debería solucionar el problema del zoom que está obteniendo en su imagen de paisaje.

  3. Tendrá pérdidas de memoria si crea un UIImagePickerController, preséntelo, y luego no tiene ninguna referencia para liberarlo más tarde. Yo recomendaría configurar el UIImagePickerController en la interfaz y configurarlo en el método viewDidLoad. Proveedores:

.h

@interface yourView:UIViewController <UIImagePickerControllerDelegate> { 
    UIImagePickerController * picker; 
} 

.m

- (void)dealloc; { 
    [picker release]; 
    [super dealloc]; 
} 

- (void)viewDidLoad; { 
    [super viewDidLoad]; 
    picker = [[UIImagePickerController alloc] init]; 
    picker.delegate = self; 
    picker.allowsEditing = YES; 
    picker.sourceType = UIImagePickerControllerSourceTypeCamera; 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex; { 
    NSString *ButtonTitle = [alertView buttonTitleAtIndex:buttonIndex]; 

    if([ButtonTitle isEqualToString:@"Choose From Library"]){ 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){ 
     picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
     [self presentModalViewController:picker animated:YES]; 
    } 
    else{ 
     // Setting up AlertDialog. 
     UIAlertView *AlertDialog; 
     AlertDialog = [[UIAlertView alloc] initWithTitle:@"Error accessing camera" 
               message:@"Device does not support a camera" 
               delegate:self 
            cancelButtonTitle:@"Dismiss" 
            otherButtonTitles:nil]; 
     [AlertDialog show]; 
     [AlertDialog release]; 
    } 
    } 
    else if([ButtonTitle isEqualToString:@"Take New Picture"]){ 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { 
     picker.sourceType = UIImagePickerControllerSourceTypeCamera; 
     [self presentModalViewController:picker animated:YES]; 
    } 
    else{ 
     // Setting up AlertDialog. 
     UIAlertView *AlertDialog; 
     AlertDialog = [[UIAlertView alloc] initWithTitle:@"Error accessing camera" 
               message:@"Device does not support a camera" 
               delegate:self 
            cancelButtonTitle:@"Dismiss" 
            otherButtonTitles:nil]; 
     [AlertDialog show]; 
     [AlertDialog release]; 
    } 
    } 
} 

Esto debe limpiar en marcha las pérdidas de memoria y mejorar el tiempo de carga. ¡Espero que ayude!

+0

desafortunadamente, esto no soluciona el problema de rotación. pero gracias por la punta de la memoria! – nicholjs

+0

¿Puedes publicar más código entonces? Debe ser algo en su controlador de vista, ya que no hay nada de malo con el código anterior. – msgambel

0

Parece que para mi proyecto esto estaba sucediendo porque no ha escrito el método shouldAutoRotateToInterface: en su controlador de vista raíz. El mensaje de rotación se propaga hasta el delegado de delegado de AutoRotateToInterface del controlador de vista raíz cuando se llama a UIImagePickerController.Su método debe tener este aspecto:

- (BOOL)shouldAutorotateToInterfaceOrientation(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

cuando actualicé mi proyecto a iOS 5, que me pidió prestado el controlador de vista raíz de un proyecto de iOS 3. iOS 3 no escribió automáticamente este método en las clases de control de vista Pruébelo y avíseme.

Cuestiones relacionadas