UIImagePickerController
- iOS 앱에서 사진 라이브러리 또는 카메라로부터 사진을 가져올 수 있는 기능
사용 방법
1. UIImagePickerController를 컨트롤러에 추가
- 'UIImagePickerController' 를 사용하기 위해 우선
'UIImagePickerControllerDelegate', 'UIImagePickerControllerDelegate' 프로토콜을 채택해야 함
extension UseControllerPictureViewController : UIImagePickerControllerDelegate, UINavigationControllerDelegate {
}
2. 이미지를 가져올 버튼과 이미지 뷰 추가
class UseControllerPictureViewController: UIViewController {
@IBOutlet weak var changeProfileBtn: UIButton!
@IBOutlet weak var profileImageView: UIImageView!
// 버튼 액션
@IBAction func changeProfileBtn(_ sender: UIButton) {
}
3. Delegate 채택
- 뷰 컨트롤러에서 사진을 부르기 위해서는 사진을 고르는 화면인 UIImagePicker를 사용해야 함
- 이를 위해 UIImagePickerControllerDelegate, UINavigationControllerDelegate를 채택
UIImagePickerControllerDelegate
- UIImagePickerController의 Delegate 프로토콜
- 이미지 피커 인터페이스에서 사용자가 사진을 선택하거나 촬영한 후 호출되는 메서드를 정의
- 사용자가 이미지를 선택하거나 촬영한 후 해당 이미지 정보를 받아와 처리하는 데 사용
protocol UIImagePickerControllerDelegate : NSObjectProtocol {
// 이미지 선택 완료 시 호출되는 메서드
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
// 이미지 선택 취소 시 호출되는 메서드
@available(iOS, introduced: 2.0, deprecated: 13.0, message: "Use PHPickerViewController result instead")
optional func imagePickerControllerDidCancel(_ picker: UIImagePickerController)
// iOS 13 이상에서 사용되는 메서드 (선택 취소 시 호출)
@available(iOS 13.0, *)
optional func imagePickerControllerDidCancel(_ picker: UIImagePickerController)
}
imagePickerController(_:didFinishPickingMediaWithInfo:)
- picker : 이미지 피커 뷰 컨트롤러 자체- info : 선택한 이미지와 관련된 정보가 들어있는 딕셔너리
UINavigationControllerDelegate
- UIImagePickerController와 함께 사용되는 delegate 프로토콜
- UIImagePickerController의 네비게이션 컨트롤러로 모달로 표시할 떄 사용
- 주로 이미지 피커를 사용할 때 이미지 선택 및 처리가 완료되었을 때 원래의 뷰 컨트롤러 돌아올 떄 필요한 기능을 구현
protocol UINavigationControllerDelegate : NSObjectProtocol {
// 이전 뷰 컨트롤러로 돌아갈 때 호출되는 메서드
optional func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool)
// 이전 뷰 컨트롤러로 돌아갔을 때 호출되는 메서드
optional func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool)
navigationController(_:willShow:animated:) (optional):
- 이미지 피커 뷰 컨트롤러가 사라지기 전에 호출
- 이미지 피커가 닫히기 전에 원하는 동작 수행
navigationController(_:didShow:animated:) (optional):
- 이전 뷰 컨트롤러로 돌아갔을 때 호출되는 메서드
- 이미지 피커 뷰 컨트롤러가 사라진 후에 호출, 이미지 피커가 닫힌 후에 원하는 동작 수행
extension UseControllerPictureViewController : UIImagePickerControllerDelegate, UINavigationControllerDelegate { ... }
4. 권한 설정
- 기본적으로 모든 애플리케이션들은 사용자의 데이터에 접근할 수 없음 -> 보안
- 이를 허용하기 위해서 앱에 권한을 추가해야 함
Info.plist를 열고
'Privacy - Photo Library Usage Description' → 사진 라이브러리에 대한 접근 권한
'NSCameraUsageDescription' → 카메라 접근 권한
'Privacy - Microphone Usage Description' -> 마이크 접근 권한
5. Image Picket 열기
extension UseControllerPictureViewController : UIImagePickerControllerDelegate, UINavigationControllerDelegate {
// 버튼 액션
@IBAction func changeProfileBtn(_ sender: UIButton) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary // 앨범 설정
imagePicker.mediaTypes = ["public.image", "public.movie"] // 카메라 설정
present(imagePicker, animated: true)
}
- IBAction 안에 UIImagePickerController의 인스턴스 생성
- 타입을 사진 라이브러리로 지정
- 뷰 컨트롤러에게 Image Picker의 이벤트 처리를 위임하기 위해 Delegate에 뷰 컨트롤러 추가
- 뷰 컨트롤러를 화면에 표시
- 카메라는 시뮬레이터에서 뜨진 않음
6. 선택된 사진 이용하기
- 선택된 사진에 대한 처리 → UIImagePickerControllerDelegate 제공하는 imagePickerController 메서드 사용
// 이미지 선택 완료 시 호출되는 메서드
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
}
didFinishPickingMediaWithInfo
- 이미지 피커에서 이미지를 선택한 후 호출되는 콜백 메서드
- 선택한 이미지와 관련된 정보를 info 매개변수로 받아서 원하는 작업을 수행
// 이미지 선택 완료 시 호출되는 메서드
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
// 선택한 이미지 가져오기
if let selectedImage = info[.originalImage] as? UIImage {
// 이미지뷰에 선택한 이미지 설정
profileImageView.image = selectedImage
}
// 화면 dismiss
dismiss(animated: true)
}
}
7. imageView 원형으로 나타내기
override func viewDidLoad() {
super.viewDidLoad()
// 이미지뷰의 cornerRadius 설정
self.profileImageView.layer.cornerRadius = profileImageView.frame.height / 2
self.profileImageView.contentMode = .scaleAspectFill
}
8. 전체 코드
//
// UseControllerPictureViewController.swift
// PracticeSwift
//
// Created by 이수현 on 2023/07/30.
//
import UIKit
class UseControllerPictureViewController: UIViewController {
@IBOutlet weak var changeProfileBtn: UIButton!
@IBOutlet weak var profileImageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// 이미지뷰의 cornerRadius 설정
self.profileImageView.layer.cornerRadius = profileImageView.frame.height / 2
self.profileImageView.contentMode = .scaleAspectFill
}
}
extension UseControllerPictureViewController : UIImagePickerControllerDelegate, UINavigationControllerDelegate {
// 버튼 액션
@IBAction func changeProfileBtn(_ sender: UIButton) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary // 앨범 설정
imagePicker.mediaTypes = ["public.image", "public.movie"] // 카메라 설정
present(imagePicker, animated: true)
}
// 이미지 선택 완료 시 호출되는 메서드
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
// 선택한 이미지 가져오기
if let selectedImage = info[.originalImage] as? UIImage {
// 이미지뷰에 선택한 이미지 설정
profileImageView.image = selectedImage
}
// 화면 dismiss
dismiss(animated: true)
}
}
참고)
https://jeonyeohun.tistory.com/208
'Swift' 카테고리의 다른 글
Swift - 키보드 올라옴 감지(NotificationCenter, Observer 사용) (0) | 2023.08.11 |
---|---|
Swift - 프로토콜 (Protocol) (0) | 2023.08.06 |
Swift - UIKit, SnapKit 비교 (0) | 2023.07.23 |
Swift - PickerView (0) | 2023.07.19 |
Swift - 비동기 처리 (Completion Handler) (0) | 2023.07.15 |