티스토리 뷰

Xcode(버전11.3)를 UIImagePickerController 카메라와 포토 라이브러리 앱 만든다:D

안타깝게도 iOS 시뮬레이터에서는 카메라가 지원이 되지 않는다..ㅜㅜ

iOS 개발자 프로그램을 등록하면 가능하니 우선 공부를 해본다.

 

 

 

- 스토리보드 화면 구성

ImageView

'사진 촬영' Button , '비디오 촬영' Button

'사진 불러오기' Button, '비디오 불러오기' Button

 

 

 

- 아웃렛 변수 추가

ImageView -> 'imgView'

 

 

 

- 액션 함수 추가

'사진 촬영' Button -> 'btnCaptureImageFromCamera'

'사진 불러오기' Button -> 'btnLoadImageFromLibrary'

'비디오 촬영' Button -> 'btnRecordVideoFromCamera'

'비디오 불러오기' Button -> 'btnLoadVidoFromLibrary'

 

 

 

전체 소스 보기

//
//  ViewController.swift
//  day191227_CameraPhotoLibray
//
//  Created by 무니 on 2019/12/27.
//  Copyright © 2019 com.mooni. All rights reserved.
//

import UIKit
import MobileCoreServices // 다양한 타입들을 정의해 놓은 헤더 파일 추가

// 델리게이트 프로토콜 추가
class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    @IBOutlet var imgView: UIImageView!
    
    // UIImagePickerController의 인스턴스 변수 생성
    let imagePicker: UIImagePickerController! = UIImagePickerController()
    // 사진을 저장할 변수
    var captureImage: UIImage!
    // 녹화한 비디오의 URL을 저장할 변수
    var videoURL: URL!
    // 사진 저장 여부를 나타낼 변수
    var flagImageSave = false
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    // 사진 촬영하기
    @IBAction func btnCaptureImageFromCamera(_ sender: UIButton) {
        // 카메라를 사용할 수 있다면(카메라의 사용 가능 여부 확인)
        if (UIImagePickerController.isSourceTypeAvailable(.camera)) {
            // 사진 저장 플래그를 true로 설정
            flagImageSave = true
            
            // 이미지 피커의 델리케이트 self로 설정
            imagePicker.delegate = self
            // 이미지 피커의 소스 타입을 camera로 설정
            imagePicker.sourceType = .camera
            // 미디어 타입 kUTTypeImage로 설정
            imagePicker.mediaTypes = [kUTTypeImage as String]
            
            // 편집을 허용하지 않음
            imagePicker.allowsEditing = false
            
            // 현재 뷰 컨트롤러를 imagePicker로 대체. 즉 뷰에 imagePicker가 보이게 함
            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
            // 이미지 피커의 소스 타입을 PhotoLibrary로 설정
            imagePicker.sourceType = .photoLibrary
            
            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.")
        }
    }
    
    // 비디오 촬영
    @IBAction func btnRecordVideoFromCamera(_ sender: UIButton) {
        
        if (UIImagePickerController.isSourceTypeAvailable(.camera)) {
            flagImageSave = true
            
            imagePicker.delegate = self
            imagePicker.sourceType = .camera
            // 미디어 타입을 kUTTypeMovie로 설정
            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 = false
            
            present(imagePicker, animated: true, completion: nil)
        } else {
            myAlert("Photo album inaccessable", message: "Application cannot access the photo album")
        }
    }
    
    // 사진, 비디오 촬영이나 선택이 끝났을 때 호출되는 델리게이트 메서드
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        // 미디어 종류 확인
        let mediaType = info[UIImagePickerController.InfoKey.mediaType] as! NSString
       
        // 미디어 종류가 사진(Image)일 경우
        if mediaType.isEqual(to: kUTTypeImage as NSString as String){
            
            // 사진을 가져와 captureImage에 저장
            captureImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
            
            if flagImageSave { // flagImageSave가 true이면
                // 사진을 포토 라이브러리에 저장
                UIImageWriteToSavedPhotosAlbum(captureImage, self, nil, nil)
            }
            imgView.image = captureImage // 가져온 사진을 이미지 뷰에 출력
        
        // 미디어 종류가 비디오(Movie)일 경우
        } else if mediaType.isEqual(to: kUTTypeMovie as NSString as String) {
             
            if flagImageSave { // flagImageSave가 true이면
                // 촬영한 비디오를 옴
                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)
    }
    
    // 경고 창 출력 함수
    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)
    }
    
}

 

 

 

시뮬레이터 결과 화면

iOS 시뮬레이터는 카메라 지원이 안되서 '사진 불러오기' 기능만 확인할 수 있었다...

당장은 무리겠지만 열심히 공부해서 좋은 앱을 만들어 앱스토어에 앱을 올리고 싶다:D

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함