본문으로 건너뛰기

Image Picker

앨범에서 사진을 선택하기 위해서 SwiftUI의 Photos picker를 사용할 수 있다. 하지만 앨범에서 선택, 사진 촬영 및 사용을 한번에 관리하기 위해서는 아직은 UIKit과 함께 사용해야한다.

UIImagePickerController

swiftUI에서 UIKit의 UIImagePickerController를 활용하여 이미지 피커를 만든 예시이다.

예제

import SwiftUI
import UIKit

struct ImagePicker: UIViewControllerRepresentable {
typealias UIViewControllerType = UIImagePickerController

@Environment(\.presentationMode)
private var presentationMode
let sourceType: UIImagePickerController.SourceType
let imagePicked: (UIImage) -> ()

class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
let parent: ImagePicker

init(parent: ImagePicker) {
self.parent = parent
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
if let image = info[.originalImage] as? UIImage {
parent.imagePicked(image)
parent.presentationMode.wrappedValue.dismiss()
}
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
parent.presentationMode.wrappedValue.dismiss()
}
}

func makeCoordinator() -> Coordinator {
Coordinator(parent: self)
}

func makeUIViewController(context: Context) -> UIImagePickerController {
let picker = UIImagePickerController()

picker.sourceType = sourceType
picker.delegate = context.coordinator

return picker
}

func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {}
}

A SwiftUI view that represents a UIKit view controller can define a Coordinator type that SwiftUI manages and provides as part of the representable view’s context.

사용

@State private var sourceType: UIImagePickerController.SourceType = .camera // button에서 .camera / .photoLibrary 상태 변경

ImagePicker(sourceType: sourceType) {
self.image = $0
}