domingo, 27 de mayo de 2012

UIActionSheet & UIImagePickerController

Como usuarios de dispositivos iOS os habréis encontrado muchas veces con un Action Sheet. Están formadas por un título opcional y uno o varios botones, cada uno de los cuales se corresponde con una acción.
La clase UIActionSheet se  utiliza para proporcionar al usuario una serie de alternativas acerca de como proceder. También se puede utilizar para informar sobre como actuar ante una situación potencialmente peligrosa.
Vamos a ver un ejemplo muy útil de utilización de UIActionSheet, el que nos da opción de realizar una foto o elegirla de nuestro carrete, por ejemplo para asignarla a un contacto. Es decir, algo así:



Como podéis ver tenemos tres botones:
  1. Hacer Foto: nos abrirá la aplicación de la cámara para realizar una nueva fotografía.
  2. Elegir Foto: permitirá acceder al carrete para escoger una foto previamente realizada.
  3. Cancelar: no realizar ninguna acción y cerrar el action sheet.
En esta ocasión no vamos a poner ningún título.

Lo primero que tenemos que añadir cuando vamos a utilizar esta clase, es el protocolo UIActionSheetDelegate. Deberemos implementar el mensaje actionSheet:clickedButtonAtIndex: , que nos indicará que botón se ha pulsado. El índice va de 0 a n.


- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex

{
    switch (buttonIndex) {
        case 0: //cámara
            [self takePhoto:UIImagePickerControllerSourceTypeCamera];
            break;
        case 1:
            [self takePhoto:UIImagePickerControllerSourceTypeSavedPhotosAlbum];
            break;            
        default:
            break;
    }
}

En el código anterior, en función del índice, estamos enviando un mensaje pasando como parámetro UIImagePickerControllerSourceTypeCameraUIImagePickerControllerSourceTypeSavedPhotosAlbum. Estas dos variables son el tipo de fuente de una clase de la que no hemos hablado hasta ahora y que vamos a necesitar para tomar las fotos: UIImagePickerController. Esta clase se utiliza para gestionar el interface que nos proporciona el sistema para realizar fotografías o vídeos, bien sea desde la cámara del dispositivo o desde la librería de fotos y/o vídeos.
El tipo de fuente puede ser:
  • UIImagePickerControllerSourceTypeCamera: nos proporciona un interface de usuario para realizar fotos o vídeos. Es el que hemos utilizado en la opción 0 del action sheet.
  • UIImagePickerControllerSourceTypePhotoLibrary o UIImagePickerControllerSourceTypeSavedPhotosAlbum: nos proporciona un interface de usuario para elegir entre fotos o vídeos guardados. 
Añadiremos el protocolo UIImagePickerControllerDelegate. Además, para usar un image picker controller, hay que seguir estos pasos:
  • Verificar que es capaz de utilizar el tipo de fuente. Para ello se utiliza el class method isSourceTypeAvailable, que tiene como parámetro una constante de  la enumeración UIImagePickerControllerSourceType:.
  • Comprobar que tipos de medios hay disponibles para el tipo de fuente utilizado. Esto se hace con el class method availableMediaTypesForSourceType:. De esta forma podemos distinguir entre una cámara que se puede usar para vídeos y una que solo se puede usar para fotos.
  • Asignar la propiedad mediaTypes para ajustar el interfaz de usuario en función del tipo de medio.
  • Mostrar el interfaz de usuario llamando al método presentModalViewController:.
  • Cerrar el image picker cuando el usuario ha hecho la acción deseada.
Dicho esto, tenemos que ver como se ha implementado el método takePhoto.

- (void)takePhoto:(UIImagePickerControllerSourceType)sourceType
{
    if ([UIImagePickerController isSourceTypeAvailable:sourceType]) //Verificamos si el dispositivo permite el tipo de fuente
    {
        NSArray *mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:sourceType]; //Comprobamos que tipos de medios hay disponibles para el tipo de fuente utilizado
        if ([mediaTypes containsObject:(NSString *)kUTTypeImage]) //Identificador de tipos abstractos para imágenes
        {
            UIImagePickerController *imagePicherController = [[UIImagePickerController alloc] init];
            imagePicherController.delegate = self;
            imagePicherController.sourceType = sourceType;
            imagePicherController.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeImage];
            imagePicherController.allowsEditing = YES;
            [self presentModalViewController:imagePicherController animated:YES];
        }
    }
    else //Si el tipo de fuente es UIImagePickerControllerSourceTypeCamera y el dispositivo no tiene, se muestra una alerta
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Photo", "Pop Up window headerr")
                                                        message:NSLocalizedString(@"Su dispositivo no permite realizar fotos",@"Pop up window error message")
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show]; 
    }
}

Por último, es necesario implementar dos métodos del protocolo UIImagePickerControllerDelegate: 
  • imagePickerController:didFinishPickingMediaWithInfo: para recuperar la foto
  • imagePickerControllerDidCancel: para cerrar el picker controller.


- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage *photo = [info objectForKey:UIImagePickerControllerEditedImage];
    if (!photo) photo = [info objectForKey:UIImagePickerControllerOriginalImage];

/*....Aquí haremos con la foto lo que necesitemos, guardarla en los defaults del usuario, crear un thumbnail, etc....*/

    [self dismisImagePicker];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [self dismisImagePicker];
}

Nada más por hoy.
@Fin

No hay comentarios:

Publicar un comentario