Swift

Swift 사진 설정하기 (UIImagePickerController 사용)

iosos 2023. 8. 5. 14:42

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 

 

[iOS] UIImagePickerController: 라이브러리에서 사진 불러오기

사진 앨범에서 사진 불러오기 오늘 정리할 내용은 iOS의 사진첩에 접근해 사진을 불러와 애플리케이션 내에 표시하는 작업의 흐름입니다. 이건 써봤을 때 정리 안하면 무조건 까먹고 다시 구글

jeonyeohun.tistory.com