본문 바로가기
아이폰 개발/ios 개념&튜토리얼

ios UIImagePickerController 정리

by 인생여희 2020. 12. 10.

ios UIImagePickerController 정리

 

ios 에서 카메라 기능과 카메라 앨범 기능을 구현하는 방법에는 몇가지가 있다. 그중에서 상대적으로 간단한 UIImagePickerController를 이용해서 카메라 사진을 찍고, 영상을 촬영하고, 사진 앨범에 접근하는 방법을 알아보자. UIImagePickerController는 애플에서 이미 만들어 놓은 카메라 기능을 가져와서 사용하기 때문에 작성할 소스 코드가 많지 않고, 구현이 비교적 단순하다.

 

UIImagePickerController 인스턴스 생성

UIImagePickerController 를 사용할려면 UIImagePickerControllerDelegate, UINavigationControllerDelegate 프로토콜을 채택한 후, UIImagePickerController 클래스의 인스턴스를 생성해야 한다. ViewController.m에서 UIImagePickerController의 인스턴스를 생성해 준다. 참고로 UIImagePickerController는 UINavigationController의 서브 클래스이다.

 

#import <UIKit/UIKit.h>
#import <MobileCoreServices/MobileCoreServices.h>

@interface ViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
{
    UIImagePickerController *imagePicker;
}
@end

 

 

UIImagePickerController 델리게이트 설정

UIImagePickerController는 델리게이트 메소드를 통해서 사용자와 상호작용한다. UIImagePickerController 객체가 초기화 되고, 화면에서 열렸을때, 즉 카메라 또는 앨범이 띄워진 후에는 사용자가 띄워진 카메라, 앨범을 컨트롤 할 수 없다. 카메라, 앨범을 작동 시킬때, 호출되는 델리게이트 메소드를 통해서 카메라와 앨범을 컨트롤 할 수 있다. 이 델리게이트 메소드가 호출될려면 델리게이트 (위임자, 처리자)를 self 로 해야 한다. 이 뜻은 ViewController에 델리게이트 메소드를 구현하고, ViewController에서 상호작용 하겠다는 뜻이다. ViewController.m의 ViewDidLoad 에서 UIImagePickerController 객체를 생성하고 델리게이트를 설정해준다.

 

- (void)viewDidLoad {
    [super viewDidLoad];
    
    imagePicker =  [[UIImagePickerController alloc]init];
    imagePicker.delegate = self;
}

 

UIImagePickerController 옵션설정

또, 사진이나 동영상 소스를 위해서 프로퍼티를 설정해야 하고, 앱에서 사용할 미디어의 형식(사진, 동영상)을 정의 해야 한다. 사진 촬영 후, 앱에 전달되기 전, 편집 할 수 있는 옵션도 지정 가능하다. UIImagePickerController 객체의 sourceType프로퍼티를 이용해서 설정할 수 있는 미디어 소스는 3가지가 있다.

 

1. 카메라 선택

imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

 

2. 갤러리의 모든 폴더에서 선택

imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

 

3. PhotosAlbum (카메라 롤)에서 선택

imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;

 

앱에서 처리할 미디어 형태는 mediaTypes 프로퍼티를 통해서 설정된다. 사진과 동영상을 동시에 지원할려면, NSArray 객체에 프로퍼티를 넣어준다.

 

1.사진 : kUTTypeImage

2.동영상 : kUTTypeMovie

 

이 값은 MobileCoreServices.h 에 정의 되어있기 때문에, MobileCoreServices framework를 추가해주고 사용할 화면에서 import를 받아준다.

 

allowsEditing 프로퍼티를 통해서 사진이 앱으로 넘겨지기전에 수정할 수 도 있다.

 

- (void)viewDidLoad {
    [super viewDidLoad];
    
    imagePicker =  [[UIImagePickerController alloc]init];
    imagePicker.delegate = self;
    
    //소스타입 : 카메라
    imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    
    //미디어 타입: 이미지, 영상
    imagePicker.mediaTypes = [NSArray arrayWithObjects:
                              (NSString *) kUTTypeImage,
                              (NSString *) kUTTypeMovie,nil];
    //편집설정
    imagePicker.allowsEditing = YES;
    
    //이미지 피커 띄우기
   [self presentViewController:imagePicker animated:YES completion:^{
        NSLog(@"이미지 피커 띄우기 성공");
    }];
}

 

카메라 기능 체크

imagePickerController 클래스를 사용할 때 기기의 기능을 체크하는 것은 필수다. 기기마다 카메라 기능을 지원하는 기기가 있을 수 있고, 없는 기기가 있을 수 있기 때문이다. imagePickerController의 isSourceTypeAvailable 클래스 메소드를 사용해서 체크 할 수 있다.

 

    //카메라 롤 기능 체크
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) {
        
    }

    //포토 라이브러리 지원 체크
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
        
    }

 

UIImagePickerController 델리게이트 메소드

사용자에게 UIImagePickerController 인터페이스가 표시되면 앱 제어는 UIImagePickerController에게 넘어간다.그러므로 ViewController 는 사용자가 사진을 찍거나 영상을 촬영할 때 앱에 알려줄 수 있는 방법이 필요하다. 이 문제를 델리게이트 메서드를 호출해서 해결한다.

UIImagePickerController 인스턴스를 만드는 클래스는 반드시 자신을 객체의 델리게이트로 선언해야 한다. 이를 위해서 <UIImagePickerControllerDelegate, UINavigationControllerDelegate> 프로토콜을 채택 해야 한다.

또한, didFinishPickingMediaWithInfo , imagePickerControllerDidCancel 두 메소드를 구현해야 한다.

 

사용자가 미디어를 선택하거나 새로 만든 경우는 didFinishPickingMediaWithInfo 메소드가 호출되고, 관련 정보는 NSDictionary 객체로 전달된다. 취소 할때는 imagePickerControllerDidCancel 메소드가 호출된다. 두 경우 모두 델리게이트 메서드에서 뷰컨트롤러를 선택 취소 해야 한다.

 

//사진 선택 델리게이트 메소드
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info{
 
    //선택한 미디어 정보
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
    
    //편집되지 않거나 촬영된 원본 사진
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    
    //imagePickerController에 편집이 허용되었다면 - 편집된 사진
    UIImage *editedImage = [info objectForKey:UIImagePickerControllerEditedImage];
    
    //동영상경우 저장된 미디어의 url
    NSURL *url =  [info objectForKey:UIImagePickerControllerMediaURL];
    
    
    //사진이나 동영상의 url을 얻었다면 앱에서는 이를 이용해서 라이브러리에 저장허가나,
    //사진을 사용자에게 표시하거나, 동영상의 경우 비디오 재생 Framework를 이용해서 재생 핤 수 있다.
    if ([mediaType isEqualToString: (NSString *)kUTTypeImage]) {
        NSLog(@"이미지를 선택하셨습니다.");
    
    }else if([mediaType isEqualToString: (NSString *)kUTTypeMovie]){
        NSLog(@"영상을 선택하셨습니다.");
    }
   
}

 

//취소
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    //imagePickerController 닫기
    [self dismissViewControllerAnimated:YES completion:nil];
}

 

 

ios 사진 영상 저장

카메라로 사용자가 사진이나 동영상을 촬영 후 이 미디어는 앱으로 전달된다. 따라서 앱에서 라이브러리에 저장 처리를 해야 한다.

사진이나 동영상은 각각 UIImageWriteToSavedPhotosAlbum 메소드와 UISaveVideoAtPathToSavedPhotosAlbum 메소드를 사용해서 저장한다. 이 메소드들은 타깃 - 액션 매커니즘을 사용하기 때문에 저장 액션은 시작되고, 앱은 계속 실행된다. 액션이 완료되면 앱에게 성공 혹은 실패를 알려주기 위해서 설정된 메소드가 호출 된다.

//사진 저장: 파라미터는 이미지
UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);

//영상 저장 : 파라미터는 영상 경로
UISaveVideoAtPathToSavedPhotosAlbum(url.path, nil, nil, nil);

 

정리

이상으로 ios UIImagePickerController의 개념에 대해서 알아보았다. 다음 포스팅에서는 이 개념을 가지고 직접 간단한 카메라와 앨범을 만들어 보자.