iOS/개념 & 개발

[swift 5 / iOS] iOS 개발 - 사진 찍기, 앨범 사진 선택하기

유정주 2021. 9. 21. 00:10
반응형

[swift 5 / iOS] iOS 개발 - 사진 찍기, 앨범 사진 선택하기

안녕하세요. 개발하는 정주입니다.

 

오늘은 swift 5를 이용해 카메라로 사진 찍는 법앨범 사진을 선택하는 방법에 대해 포스팅하려고 합니다.

찍은 사진 혹은 선택한 사진을 UIImageView에 삽입까지 해보겠습니다.

 

마지막 동작 영상은 맨 아래에 있습니다.

바로 시작합니다.

 


권한 설정

카메라와 사진 앨범을 사용하기 위해서는 권한을 설정해주어야 합니다.

Xcode의 Info.plist를 열어 아래 권한을 추가해줍니다.

Value는 권한 팝업의 텍스트입니다. 이는 권한을 사용하는 이유를 적는 것이 일반적입니다.

대충 적어도 기능 사용에는 문제가 없지만 추후 앱스토어에 올릴 때 설명이 없으면 Reject 한다고 합니다.

앱스토어에 출시할 앱을 개발하실 때는 유저 입장에 맞춰 성실히 작성하셔야 합니다.


UIImagePickerController 선언

카메라를 열거나 앨범을 사용하기 위해서는 UIImagePickerController을 사용해야 합니다.

공식 문서에 나와있는 설명은 아래와 같습니다.

A view controller that manages the system interfaces for taking pictures, recording movies, and choosing items from the user's media library.

사진, 앨범, 동영상 등을 위한 system interfaces를 관리하는 view controller라고 합니다.

let imagePickerController = UIImagePickerController()

저는 imagePickerController라는 이름으로 선언해주었습니다.

 


버튼 추가 / Action 정의

사진 찍기, 사진 선택을 기본 버튼으로 만들었습니다.

 

swift 파일에 Action 연결하고 각 함수에 카메라를 실행하거나 앨범을 나오게 하는 코드를 작성합니다.

    @IBAction func clickCapture(_ sender: UIButton) {
        self.imagePickerController.delegate = self
        self.imagePickerController.sourceType = .camera
        //animated true : 아래에서 올라오는 애니메이션
        //false : 바로 화면이 나옴
        present(self.imagePickerController, animated: true, completion: nil)
    }
    
    
    @IBAction func clickGallery(_ sender: UIButton) {
        self.imagePickerController.delegate = self
        self.imagePickerController.sourceType = .photoLibrary
        present(self.imagePickerController, animated: true, completion: nil)
    }

참고로 카메라는 시뮬레이터 실행 시 에러가 나오므로 꼭 자신의 아이폰에 올려서 테스트하셔야 합니다.

 

여기까지 했을 때 사진 찍기 버튼을 누르면 카메라가 실행되고 사진 선택 버튼을 누르면 앨범이 열립니다.

선택한 사진을 실제로 사용하기 위해서는 프로토콜을 채택해야 합니다.

이를 위한 delegate 설정은 바로 아래에서 다룹니다.

 


프로토콜 채택

이제 프로토콜을 채택하고 사진이 선택, 취소될 때 어떤 행동을 할 것인지 정의해주면 됩니다.

ViewController.swift 파일의 ViewController 옆에 , 키워드로 추가해줘도 되고 저처럼 extension으로 따로 작성해도 됩니다.

저는 파일을 따로 만들진 않았고 class { } 아래에 추가해주었습니다.

class ViewController: UIViewController {
	...
}

extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
}

 

해당 extension 안에 imagePickerController()imagePickerControllerDidCancel()를 정의합니다.


UIImageView에 설정하기

UIImagePickerController에서 사진이 선택되거나 취소되면 호출되는 함수가 있습니다. 

그것이 바로 위에서 말한 imagePickerController()와 imagePickerControllerDidCancel()입니다.

두 함수 모두 조금만 치면 자동 완성되니 너무 겁먹지 마세요.

 

먼저 imagePickerController()를 작성하겠습니다. imagePickerController()는 사진을 선택하거나 찍은 사진을 사용한다고 하면 호출됩니다.

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            centerImage.image = image
        }
        
        picker.dismiss(animated: true, completion: nil) //dismiss를 직접 해야함
    }

이미지가 들어오면 UIImageView에 설정하고 picker를 숨깁니다.

picker를 직접 숨겨야 한다는 게 주의점이라면 주의점이네요.

 

취소를 누르면 imagePickerControllerDidCancel()이 호출됩니다.

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }

이때는 picker만 숨기겠습니다.

 


동작 영상

중간에 카메라 권한 팝업이 왜 두 번이 나왔는지는 모르겠네요... ㅎㅎ..


마무리 잡담

오늘은 카메라와 앨범 사용에 대해 알아보았습니다.

생각보다 까다롭고 설정할게 많습니다.

개인정보에 관련된 내용이다 보니 더 까다로운 처리를 요구하는 듯합니다.

 

감사합니다! 

 


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

반응형