Things take time

[SWIFT] 카메라 사진 찍기, 앨범에서 사진 가져오기 본문

iOS (기능)

[SWIFT] 카메라 사진 찍기, 앨범에서 사진 가져오기

겸손할 겸 2017. 5. 15. 15:06

카메라로 사진을 찍고, 앨범을 호출해서 해당 이미지를 불러와 이미지 뷰에 뿌리는 작업이다.

간단한 예제라서 설명은 길게 할 필요는 없고, Http 통신 공부 후에 업로드하는 포스팅을 작성할 것이다.


[사전 작업]

iOS도 안드로이드와 마찬가지로 권한을 요청해야하는데, 다만 코드로 직접 퍼미션을 관리하는 안드로이드와 달리 설정내용을 저장하는 plist가 있어 간편하게 사용할 수 있다.


카메라와 앨범을 사용하겠다는 권한을 추가한다.



import UIKit
import MobileCoreServices // swift 모든 데이터타입(미디어 등)이 정의되어 있는 헤더

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var imageView: UIImageView!
    
    let imagePicker: UIImagePickerController! = UIImagePickerController()
    var captureImage: UIImage!
    var flagImageSave = false
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func cameraClicked(_ sender: UIButton) {
        if(UIImagePickerController.isSourceTypeAvailable(.camera)){
            flagImageSave = true
            imagePicker.delegate = self
            imagePicker.sourceType = .camera
            imagePicker.mediaTypes = [kUTTypeImage as String]
            imagePicker.allowsEditing = false
            
            present(imagePicker, animated: true, completion: nil)
        }
    }
    @IBAction func albumClicked(_ sender: UIButton) {
        if (UIImagePickerController.isSourceTypeAvailable(.photoLibrary)) {
            flagImageSave = false
            
            imagePicker.delegate = self
            imagePicker.sourceType = .photoLibrary
            imagePicker.mediaTypes = [kUTTypeImage as String]
            imagePicker.allowsEditing = true
            
            present(imagePicker, animated: true, completion: nil)
        }
    }
    
    
    // 사진 찍은 후, 앨범에서 사진을 가져온 후 실행되는 함수
    @available(iOS 2.0, *)
    public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]){
        let mediaType = info[UIImagePickerControllerMediaType] as! NSString
        print(mediaType)
        
        if mediaType.isEqual(to: kUTTypeImage as NSString as String) {
            captureImage = info[UIImagePickerControllerOriginalImage] as! UIImage
            
            if flagImageSave {
                UIImageWriteToSavedPhotosAlbum(captureImage, self, nil, nil)
            }
            
            imageView.image = captureImage
        }
        self.dismiss(animated: true, completion: nil)
    }
    
    @available(iOS 2.0, *)
    public func imagePickerControllerDidCancel(_ picker: UIImagePickerController){
        self.dismiss(animated: true, completion: nil)
    }
}

1. MobileCoreServices라는 스위프트에서 사용하는 모든 데이터타입이 정의된 헤더파일을 import, 이 안에 미디어 타입 등이 정의되어있다.

2. 카메라나 앨범을 사용하려면 UIImagePickerController를 사용해야하는데 그 딜리게이트는 UINavigationController도 같이 포함되어 있다(커맨드로 들어가서 delegate검색하면 나옴) 그러므로 두 개의 프로토콜을 상속받는다.

3. 나머지는 문법, 정해진 방법이므로 이 방법대로 사용한다.