Computer >> 컴퓨터 >  >> 프로그래밍 >> iOS

Swift로 iOS 카메라에서 사진 캡처하기: UIImagePickerController 활용 가이드

개요: AVFoundation 대신 UIImagePickerController를 선택하는 이유

iOS에서 Swift로 카메라 사진을 캡처하려면 iOS SDK에 포함된 AVFoundation 프레임워크를 사용할 수 있습니다. 하지만 AVFoundation은 커스텀 카메라 UI, 수동 포커스, 필터 적용 등 고급 기능이 필요할 때 적합하며, 구현 난이도가 상당히 높습니다.

이번 예제에서는 단순히 카메라로 사진을 한 장 촬영하고 화면에 표시하는 기능만 구현합니다. 따라서 복잡한 AVFoundation 대신 iOS에서 기본 제공하는 UIImagePickerController를 사용하면 훨씬 간단하고 빠르게 원하는 기능을 만들 수 있습니다.

1단계: 프로젝트 생성 및 UI 구성

먼저 새 프로젝트를 생성한 뒤, 스토리보드의 ViewController에 ImageView를 추가합니다. 그리고 해당 ImageView를 클래스에 아울렛(Outlet)으로 연결합니다.

다음으로 ViewController 클래스가 카메라와 이미지 피커를 다룰 수 있도록 아래 두 델리게이트 프로토콜을 채택합니다.

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate
  • UIImagePickerControllerDelegate: 이미지 선택 또는 촬영 결과를 받기 위해 필요
  • UINavigationControllerDelegate: 이미지 피커의 네비게이션 동작을 지원하기 위해 필요

2단계: 화면 탭 시 카메라 실행하기

카메라를 여는 openCamera 함수를 @objc로 선언합니다. Objective-C 런타임에서 selector로 호출되어야 하기 때문입니다.

@objc func openCamera() {
}

이제 viewDidLoad에서 뷰 컨트롤러 전체에 탭 제스처 인식기를 추가하여, 사용자가 화면을 탭하면 카메라가 열리도록 설정합니다.

override func viewDidLoad() {
    super.viewDidLoad()
    let gesture = UITapGestureRecognizer(target: self, action: #selector(openCamera))
    self.view.addGestureRecognizer(gesture)
}

3단계: 카메라 열기 함수 구현

openCamera 함수 안에 다음 코드를 작성합니다. 핵심은 sourceType.camera로 지정하는 것입니다.

@objc func openCamera() {
    let imgPicker = UIImagePickerController()
    imgPicker.delegate = self
    imgPicker.sourceType = .camera
    imgPicker.allowsEditing = false
    imgPicker.showsCameraControls = true
    self.present(imgPicker, animated: true, completion: nil)
}
  • delegate = self: 촬영 결과를 현재 뷰 컨트롤러에서 처리
  • allowsEditing = false: 촬영 후 편집 화면 비활성화 (true로 설정 시 편집된 이미지 반환)
  • showsCameraControls = true: 기본 셔터 버튼 등 카메라 컨트롤 표시

4단계: 촬영된 이미지 받아서 표시하기

사용자가 사진을 촬영하면 UIImagePickerControllerDelegatedidFinishPickingMediaWithInfo 메서드가 호출됩니다. 이 메서드 내부에서 촬영된 이미지를 가져와 ImageView에 표시합니다.

func imagePickerController(_ picker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    if let img = info[UIImagePickerController.InfoKey.editedImage] as? UIImage {
        self.imgV.image = img
        self.dismiss(animated: true, completion: nil)
    } else {
        print("error")
    }
}

info 딕셔너리에는 원본 이미지(.originalImage)와 편집된 이미지(.editedImage)가 담겨 있습니다. 위 예제에서는 편집된 이미지를 우선적으로 확인하고, 성공하면 ImageView에 할당한 뒤 카메라 화면을 닫습니다.

5단계: Info.plist 카메라 권한 설정 (필수!)

마지막으로 매우 중요한 단계입니다. Info.plist 파일에 NSCameraUsageDescription(카메라 사용 설명) 키를 추가하고, 앱이 카메라를 사용하려는 이유를 명시해야 합니다.

예시: "프로필 사진 촬영을 위해 카메라 접근이 필요합니다."

이 키가 없으면 앱 실행 즉시 크래시가 발생하므로 반드시 추가해야 합니다. iOS는 사용자 개인정보 보호를 위해 모든 카메라 접근에 대해 사전 고지를 요구합니다.

실행 결과 및 주의사항

위 단계를 모두 완료한 후 실제 iPhone에서 앱을 실행하고 화면을 탭하면 카메라가 열리고, 촬영한 사진이 ImageView에 표시됩니다.

Swift로 iOS 카메라에서 사진 캡처하기: UIImagePickerController 활용 가이드

주의: 시뮬레이터(Simulator)에는 실제 카메라 하드웨어가 없으므로, 이 앱은 반드시 실제 기기에서 실행해야 정상적으로 동작합니다.