[IOS] Do it (14) 카메라와 포토 라이브러리 App 구현

728x90

카메라와 포토 라이브러리 App 구현


IOS에서 제공하는 UIImagePickerController 클래스를 사용하여
카메라와 포토 라이브러리를 구현하고 카메라를 이용하여 사진이나 비디오를 촬영하고
포토 라이브러리에 저장하는 것이 가능한 App을 구현하도록 하겠습니다.

결과 화면


스토리 보드


ViewController.swift (메인화면 - Audio / Record)

//
//  ViewController.swift
//  CameraPhotoLibrary
//
//  Created by HwangSeungyeon on 2020/09/17.
//

import UIKit
import MobileCoreServices //다양한 헤더파일을 정의해 놓은 헤더 파일

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet var imgView: UIImageView!

    //MARK: 코딩에 필요한 인스턴스 변수 선언
    let imagePicker: UIImagePickerController! = UIImagePickerController() //UIImagePickerController 인스턴스 변수 생성
    var captureImage: UIImage! //촬영을 하거나 포토 라이브러리에서 불러온 사진(Image)을 저장할 변수
    var videoURL: URL! //녹화한 비디오의 URL를 저장할 변수
    var flageImageSave = false //이미지 저장 여부를 나타낼 변수

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    //MARK: 사진촬영 코드
    @IBAction func btnCaptureImageFromCamera(_ sender: UIButton) {
        if (UIImagePickerController.isSourceTypeAvailable(.camera)){ //카메라의 사용 가능 여부를 확인, 사용할 수 있다면 아래 내용 수행
            flageImageSave = true //카메라 촬영후 저장하기 때문에 이미지 저장 허용

            imagePicker.delegate = self //이미지 피커의 델리게이트 self로 지정
            imagePicker.sourceType = .camera //이미지 피커의 소스 타입을 camera로 설정
            imagePicker.mediaTypes = [kUTTypeImage as String] //미디어 타입 kUTTypeImage로 서정
            imagePicker.allowsEditing = false //편집은 허용 하지 않음

            present(imagePicker, animated: true, completion: nil) //현재 뷰 컨트롤러를 imagePikcer로 대체, 즉 imagePikcer가 보이게 합니다
        }
        else {
            myAlert("Camera inaccessable", message: "Application cannot access the camera.") //카메라를 사용할 수 없을 때는 경고창 나타낸다
        }
    }

    //MARK: 사진 불러오기 코드
    @IBAction func btnLoadImageFromLibrary(_ sender: UIButton) {
        if (UIImagePickerController.isSourceTypeAvailable(.photoLibrary)) {
            flageImageSave = false

            imagePicker.delegate = self
            imagePicker.sourceType = .photoLibrary //이미지 피커의 소스타입을 PhotoLibraray로 설정
            imagePicker.mediaTypes = [kUTTypeImage as String]
            imagePicker.allowsEditing = true //편집 허용

            present(imagePicker, animated: true, completion: nil)
        }
        else {
            myAlert("Photo album inaccessable", message: "Application cannot access the photo album.")
        }
    }

    //MARK: 비디오 촬영 코드
    @IBAction func btnRecordVideoFromCamera(_ sender: UIButton) {
        if (UIImagePickerController.isSourceTypeAvailable(.camera)) {
            flageImageSave = true

            imagePicker.delegate = self
            imagePicker.sourceType = .camera
            imagePicker.mediaTypes = [kUTTypeMovie as String] //미디어 타입을 kUTTypeMovie로 설정
            imagePicker.allowsEditing = false

            present(imagePicker, animated: true, completion: nil)
        }
        else {
            myAlert("Camera inaccessable", message: "Application cannot access the camera.")
        }
    }

    //MARK: 비디오 불러오기 코드
    @IBAction func btnLoadVideoFromLibrary(_ sender: UIButton) {
        if (UIImagePickerController.isSourceTypeAvailable(.photoLibrary)) {
            flageImageSave = false

            imagePicker.delegate = self
            imagePicker.sourceType = .photoLibrary
            imagePicker.mediaTypes = [kUTTypeMovie as String]
            imagePicker.allowsEditing = false

            present(imagePicker, animated: true, completion: nil)
        }
        else {
            myAlert("Photo album inaccessable", message: "Application cannot access the photo album.")
        }
    }

    //MARK: Delegate 메서드 구현
    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) { //미디어의 종류가 사진(Image)일 경우
            captureImage = info[UIImagePickerController.InfoKey.originalImage]
            as? UIImage //사진을 가져와 captureImage에 저장

            //flageImageSave가 true이면 가져온 사진을 포토 라이브러리에 저장
            if flageImageSave {
                UIImageWriteToSavedPhotosAlbum(captureImage, self, nil, nil)
            }

            imgView.image = captureImage
        } else if mediaType.isEqual(to: kUTTypeMovie as NSString as String) { //미디어의 종류가 비디오(Movie)일 경우

            //flagImageSave가 true이면 촬영한 비디오를 가져와 포토 라이브러리에 저장
            if flageImageSave {
                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) //현재의 뷰(이미지 피커) 제거
    }

    //MARK: 경고 표시용 메서드 작성
    //문제가 생겼을 때 화면에 표시해 줄 경교 표시용 메서드 입니다.
    //Title과 Message를 받아 창에 표시
    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)
    }
}

전체 코드

CameraPhotoLibrary.zip
0.04MB


출처 : Do it 스위프트로 앱 만들기

728x90

댓글

Designed by JB FACTORY