티스토리 뷰
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
'IT > swift' 카테고리의 다른 글
[iOS/swift] Error - Class 'ViewController' has no initializers (0) | 2019.12.30 |
---|---|
[iOS/swift] UIImagePickerController 카메라와 포토 라이브러리(사진첩) 앱v2 만들기 (3) | 2019.12.30 |
[iOS/swift] AVPlayerViewController 비디오(동영상) 재생 앱 만들기 (0) | 2019.12.26 |
[iOS/swift] AVAudioPlayer 음악(오디오) 재생 및 녹음 앱 v2, 이미지를 보여주는 기능 추가하기 (0) | 2019.12.26 |
[iOS/swift] AVAudioPlayer 음악(오디오) 재생 및 녹음 앱 만들기 (0) | 2019.12.26 |