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를 배치하고 그 아래 카메라 버튼과 앨범 버튼을 배치했다.
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 개념&튜토리얼' 카테고리의 다른 글
iOS 코어데이터 예제(feat: 기초 개념) (0) | 2020.12.13 |
---|---|
ios TableView 예제 (0) | 2020.12.11 |
ios UIImagePickerController 정리 (1) | 2020.12.10 |
ios CollectionView 예제 - Cell 아이템 선택 및 간격 (0) | 2020.12.10 |
ios CollectionView 예제 - Section 생성 (0) | 2020.12.09 |