UIImagePickerController를 활용하여, 사진촬영, 동영상 촬영, Library 가져오기

4개의 이용방안에 함수가 모양이 비슷합니다. 

 

전체 소스입니다.

import UIKit
import MobileCoreServices

class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    @IBOutlet weak var imgView: UIImageView!
    
    let imagePicker : UIImagePickerController! = UIImagePickerController()
    var captureImage : UIImage!
    var videoURL : URL!
    var flagImageSave = false
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    func myAlert(_  title : String, message: String) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertController.Style.alert)
        let action = UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil)
        
        alert.addAction(action)
        self.present(alert, animated: true, completion: nil)
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        let mediaType = info[UIImagePickerController.InfoKey.mediaType] as! NSString
        
        if mediaType.isEqual(to: kUTTypeImage as NSString as String) {
            captureImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
            
            if flagImageSave {
                UIImageWriteToSavedPhotosAlbum(captureImage, self, nil, nil)
            }
            
            imgView.image = captureImage
        } else if mediaType.isEqual(to: kUTTypeMovie as NSString as String) {
            videoURL = (info[UIImagePickerController.InfoKey.mediaURL] as! URL)
            
            UISaveVideoAtPathToSavedPhotosAlbum(videoURL.relativePath, self, nil, nil)
        }
        
        self.dismiss(animated: true, completion: nil)
    }
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        self.dismiss(animated: true, completion: nil)
    }


    @IBAction func btnCaptureImageFromCamera(_ 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)
        } else {
            myAlert("Camera inaccessable", message: "Application cannot access the camera.")
        }
    }
    @IBAction func btnLoadImageFromLibrary(_ 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)
        } else {
            myAlert("Phto album inaccessable", message: "Application cannot access the photo album.")
        }
    }
    @IBAction func btnRecordVideoFromCamera(_ sender: UIButton) {
        if (UIImagePickerController.isSourceTypeAvailable(.camera)) {
            flagImageSave = true
            
            imagePicker.delegate = self
            imagePicker.sourceType = .camera
            imagePicker.mediaTypes = [kUTTypeMovie as String]
            imagePicker.allowsEditing = false
            
            present(imagePicker, animated: true, completion: nil)
        } else {
            myAlert("Camera inaccessable", message: "Application cannot access the camera.")
        }
    }
    @IBAction func btnLoadVideoFromLibrary(_ sender: UIButton) {
        if (UIImagePickerController.isSourceTypeAvailable(.photoLibrary)) {
            flagImageSave = false
            
            imagePicker.delegate = self
            imagePicker.sourceType = .photoLibrary
            imagePicker.mediaTypes = [kUTTypeMovie as String]
            imagePicker.allowsEditing = true
            
            present(imagePicker, animated: true, completion: nil)
        } else {
            myAlert("Phto album inaccessable", message: "Application cannot access the photo album.")
        }
    }
}
Posted by 목표를 가지고 달린다
,

1. 이미지를 배치하고, "Aspect Fit"으로 설정하면, 사진이 찌그러지는 것을 막기 위해 비율에 맞게 표시할 수 있다. 다만 여백이 생길 수 있는데, 이때... "Background"으로 [System grouped Background Color] 색상을 설정하면, 이미지가 비율에 맞게 보일 때 남는 여백을 표시할 수 있다. 

2. 카메라 테스트는 iOS 시뮬레이터에서 할수 없어서, 기기에 옮겨서 해야 하는데, 이때 개발자 라이선스 등록이 되어야 한다. 카메라, GPS, 자이로센서, 조도 센서, 블루투스 등의 동작을 확인하려면 기기에서 직접 동작해 봐야 한다. 

3. 카메라 사용권한! [info.plist] 파일에서 [Main storyboard file base name]을 + 클릭한다. 그리고 Privcy라고 입력하면, 관련키 목록이 나타난다. 여기서 [Privacy - Camera Usage Description]을 선택한다. 같은 방법은
 - 마이크로폰 접근키 : Privacy - Microphone Usage Description
 - 포토라이브러리 저장키 : Privacy - Phto Libary Additions Usage Description
 - 포토라이브러리 접근키 : Privacy - Photo Library Usage Description  을 추가한다.
그러면, 다음 실행할때, 권한 승인 여부를 확인하는 창이 뜬다.  

4. 사진이나 비디오 촬영을 하거나 포토 라이브러리에서 선택을 끝났을 때, 호출되는 didFinishPickingMediaWithInfo()메소드를 구현하여, 선택한 이미지나 동영상이 재생되도록한다.

5. 사진이나 비디오 촬영을 취소하거나, 포토 라이브러리에서 선택을 하지 않았을 때, 호출되는 imagePickerControllerDidCancel()메소드를 구현하여, 선택한 이미지나 동영상이 재생되도록한다.

6. iOS 시뮬레이터에서 멀티 터치를 테스트하려면, option키를 눌러야 동시 터치가 가능합니다.

/**** 
	핀치 제스쳐를 이용해서 이미지와 폰트 크기를 변화시키는 예제코드
    시뮬레이터에서 테스트시 option키를 누른 상태에서 키패드를 조작해야 멀티-터치가 됨
****/
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var lblPinch: UILabel!
    
    var initialFontSize : CGFloat!
    
    @IBOutlet weak var imgView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let pinch = UIPinchGestureRecognizer(target: self, action: #selector(ViewController.doPinch(_:)))
        
        self.view.addGestureRecognizer(pinch)
        
        let pinchImage = UIPinchGestureRecognizer(target: self, action: #selector(ViewController.doPinchImage(_:)))
        
        self.view.addGestureRecognizer(pinchImage)
    }
    
    @objc func doPinch(_ pinch : UIPinchGestureRecognizer) {
        if pinch.state == UIPinchGestureRecognizer.State.began {
            initialFontSize = lblPinch.font.pointSize
        } else {
            lblPinch.font = lblPinch.font.withSize(initialFontSize * pinch.scale)
        }
    }
    
    
    @objc func doPinchImage(_ pinch : UIPinchGestureRecognizer) {
        imgView.transform = imgView.transform.scaledBy(x: pinch.scale, y: pinch.scale)
        pinch.scale = 1
    }


}
Posted by 목표를 가지고 달린다
,