2012년 12월 23일 일요일

[iOS6] UIImagePickerController 사용하기

사용자가 iOS Device에서 사진을 찍고, 그 이미지를 선택하거나, 사용자의 Photo Library에서 이미지를 선택하는 기능을 UIImagePickerController를 사용해서 구현할 수 있다.

사진을 찍을 수도 있고, Photo Library에서 선택을 할 수 있는데, 현재의 iOS가 지원을 하는지 확인이 필요하다. iPad 2부터는 기본적으로 카메라가 있으므로 구분할 필요가 없겠지만....

소스
    Boolean cameraEnabled = NO;
    Boolean photoLibEnabled = NO;
    if( [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
        cameraEnabled = YES;
    }
    if( [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){
        photoLibEnabled = YES;
    }

카메라 촬영이 가능한지, 포토 라이브러리를 접근하는 것이 가능한지를 알 수 있는 함수가 위 2가지 함수이다.
 이 정보를 가지고, ActionSheet를 통해서 새로 찍을 것인지, 기존 것을 선택할 것인지 선택하게 하고, 사진을 찍을 경우와 선택할 경우를 따로  구분해서 UIImagePickerController를 만든다.

소스

카메라를 사용할 수 있고, 지원하는 타입에 이미지 형식이 있을 경우..
    NSArray *mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:
                                            UIImagePickerControllerSourceTypeCamera];
    if ([mediaTypes containsObject:(NSString *)kUTTypeImage]) {
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.delegate = self;
        picker.sourceType = UIImagePickerControllerSourceTypeCamera;
        picker.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeImage];
        picker.allowsEditing = NO;
        [self presentViewController:picker animated:YES completion:^{
            NSLog(@"presentViewController completion");
        }];
    }
포토 라이브러리를 사용할 수 있고, 지원하는 타입에 이미지가 있을 경우..
    NSArray *mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:
                                      UIImagePickerControllerSourceTypePhotoLibrary];
    if ([mediaTypes containsObject:(NSString *)kUTTypeImage]) {
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.delegate = self;
        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        picker.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeImage];
        picker.allowsEditing = NO;
        [self presentViewController:picker animated:YES completion:^{
            NSLog(@"presentViewController completion");
        }];
    }
아래는 이미지를 선택하거나 사진을 찍은 후에, UIImagePickerControllerDelegate로 받는 함수들이다. dismissImagePicker, Cancel, didFinishPickingMediaWithInfo함수가 있다.
- (void)dismissImagePicker
{
    [self dismissViewControllerAnimated:YES completion:^{
        NSLog(@"dismissViewControllerAnimated completion: ");
    }];
}

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

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    //Editing된 이미지를 가져온다.
    UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
    //Edit하지 않았으면 원 이미지를 가져온다.
    if (!image) image = [info objectForKey:UIImagePickerControllerOriginalImage];
    if (image) {
        [self setImage:image]; //가져온 이미지를 처리한다.
    }
    [self dismissImagePicker];
}

설명

 왼쪽의 화면이 3가지 종류의 Media Type을 선택할 수 있는 ActionSheet를 표시한 것이다.


UIImagePickerControllerSourceType
The source to use when picking an image or when determining available media types.
와 같이 3가지 종류가 있다.

enum {
   UIImagePickerControllerSourceTypePhotoLibrary,
   UIImagePickerControllerSourceTypeCamera,
   UIImagePickerControllerSourceTypeSavedPhotosAlbum
};
typedef NSUInteger UIImagePickerControllerSourceType;






카메라를 선택할 경우 왼쪽과 같이 카메라를 찍고, 그 사진을 선택할 수 있다.

















Photo Library를 이용할 경우, 사용자에게 애플리케이션이 접근하는 것을 허용할 것인지를 묻고, 승인을 받아야 접근할 수 있게 된다.
만약 승인을 하지 않으면, 아래와 같이 접속이 안된다.

사용자가 Photo Library에 접근하는 것을 허용하지 않은 경우 왼쪽과 같이 표시된다.













접근을 허용한 경우, 왼쪽과 같이 화면에 표시가 된다.

SavedPhotosAlbum은 카메라로 찍은 사진들이 저정되어 있는 Camera Roll을 바로 접근하도록 해준다.