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

ios UIImagePickerController 카메라 만들기

by 인생여희 2020. 12. 11.

ios UIImagePickerController 카메라 만들기

 

지난 포스팅에이어서 이번에는 UIImagePickerController로 간단한 카메라를 만들어 보자. UIImagePickerController의 개념에 대해서 생소한 사람은 ios UIImagePickerController 정리부분을 보고 오면 도움이 될 것이다. 이 포스팅을 따라서 만들어 보고 나중에 봐도 상관없다.

 

 

준비

1.프로젝트 하나를 생성하고 Build phases에서 MobileCoreServices framework를 추가해준다.

 

2.ViewController.h 에 위에서 추가한 프레임워크를 import 해준다.

 

3.ViewController.h 에서 UIImagePickerControllerDelegate , UINavigationControllerDelegate 프로토콜을 채택해준다.

 

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

@interface ViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
@end

 

화면 생성

스토리보드로 가서 간단하게 아래 그림과 같은 화면을 만든다. 화면 중앙에는 UIImageView를 배치하고 그 아래 카메라 버튼과 앨범 버튼을 배치했다.

 

UIImagePickerController 화면

IBOutlet 연결

ViewController.h 로가서 위에서 만든 UIImageView를 컨트롤러와 연결해 준다. 그리고 새로찍은 사진인지 확인하는 BOOL 타입의 변수도 하나 작성해 준다. 

 

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

@interface ViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate>

@property BOOL newMedia;
@property (strong, nonatomic) IBOutlet UIImageView *imageView;

@end

 

카메라 촬영 기능

위 화면에서 만든 카메라 버튼을 눌렀을 때 실행되는 메소드를 만들어 본다. 먼저 기기에서 카메라를 사용할 수 있는지 체크한 후 UIImagePickerController 객체를 생성하고 소스타입, 미디어 소스, 편집허용여부, 등을 체크하고 UIImagePickerController를 띄워 준다. 그리고 새로운 사진 촬영이기 때문에 _newMedia 플래그를 YES로 변경해 준다.

 

//카메라 사용
- (IBAction)userCamera:(id)sender {
    
    //먼저 기기에서 카메라를 사용할 수 있는지 체크를 해야 한다.
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        
        //UIImagePickerController 객체 생성
        UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
        imagePicker.delegate = self;
        
        //소스 타입은 카메라
        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        
        //미디어 소스는 카메라로 정의 한다.
        imagePicker.mediaTypes = [NSArray arrayWithObjects:(NSString *)kUTTypeImage, nil];
        
        //편집 안함
        imagePicker.allowsEditing = NO;
        
        [self presentViewController:imagePicker animated:YES completion:nil];
        
        //newMedia 플래그를 Yes로 설정해서 이 사진이 새로 만들어진것이고, 카메라 롤에 있던 사진이 아님을 표시한다.
        _newMedia = YES;
    }

}

 

카메라 앨범 열기

앨범 버튼은 위의 카메라 기능 버튼과 로직이 비슷하다.

 

- (IBAction)userCameraRoll:(id)sender {
    
    //userCameraRoll은 미디어 타입 소스가 UIImagePickerControllerSourceTypePhotoLibrary 이다.

    //포토앨범 기능 있는지 체크
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) {
        
        UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
        imagePicker.delegate = self;
        imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        imagePicker.mediaTypes = [NSArray arrayWithObjects:(NSString *)kUTTypeImage, nil];
        imagePicker.allowsEditing = NO;
         [self presentViewController:imagePicker animated:YES completion:nil];
     
        //이미 라이브러리에 있던 사진이므로 다시 저장할 필요 없다.
        _newMedia = NO;
    }
    
}

 

사진선택

마지막으로 사진촬영이나 사진 선택이 끝났을 때 호출되는 메소드를 알아보자. 여기서는 선택한 미디어 정보를 체크하고 이미지피커뷰 컨트롤러를 닫아 준다. 그리고 이미지냐, 영상이냐에 따라서 저장을 달리 해주는 처리를 한다.

 

//사진 촬영이나 선택이 끝났을 때 호출
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info{
 

    //선택한 미디어 정보
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
    
    //이미지피커 뷰 컨트롤러 닫기
    [self dismissViewControllerAnimated:YES completion:nil];
    
    //미디어 타입 체크 - 이미지
    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
        
        //이미지 원본
        UIImage *image = info[UIImagePickerControllerOriginalImage];
        
        _imageView.image = image;
        
         //새로 찍은 사진이면 저장
        if (_newMedia) {
            
            //사진 저장
            UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);
        }
    
    //영상일 경우
    }else if([mediaType isEqualToString:(NSString *)kUTTypeMovie]){
       
        //비디오 지원하는 코드 작성
        //동영상경우 저장된 미디어의 url
        NSURL *url =  [info objectForKey:UIImagePickerControllerMediaURL];
        //영상 저장
        if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(url.path)) {
            UISaveVideoAtPathToSavedPhotosAlbum(url.path, nil, nil, nil);
        }
    }
}

 

취소를 눌렀을 때는 아래 메소드가 호출된다. 단순히 이미지 피커 뷰컨트롤러를 닫아주면 된다.

 

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

 

테스트 

앱을 실행한 후 카메라 버튼을 누르면 아래와 같이 사진을 찍을 수 있는 화면이 열린다. 그리고 사진을 찍으면 찍은 사진이 UIImageView에 출력된다. 테스트 해보자.

 

ios 카메라