SwiftUI 使用相机捕获图片
本文描述了在 SwiftUI 应用中如何使用相机捕获一张图片
前提条件
具体步骤
声明权限
在 Info.plist
文件中增加 NSCameraUsageDescription
键. 注意, 必须提供一个具体的使用例子, 不然可能会被 App Store 审核人员拒绝. Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage
xml
<key>NSCameraUsageDescription</key>
<string>The app needs camera permission to capture a photo. For instance, it could be used to generate an image in the style of Ghibli.</string>
定义 PhotoCapturer
swift
import UIKit
import SwiftUI
struct PhotoCapturer: UIViewControllerRepresentable {
@Binding var isOpen: Bool
let onCaptured: (UIImage) -> Void
func makeUIViewController(context: Context) -> some UIViewController {
let imagePicker = UIImagePickerController()
imagePicker.sourceType = .camera
imagePicker.delegate = context.coordinator
return imagePicker
}
func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
}
func makeCoordinator() -> Coordinator {
return Coordinator(self)
}
class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var parent: PhotoCapturer
init(_ picker: PhotoCapturer) {
self.parent = picker
}
// When user has cancelled the image picker UI
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
print("Photo capturer cancelled")
parent.isOpen = false
}
// When user has picked an image
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
print("Photo captured")
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
DispatchQueue.main.async {
self.parent.onCaptured(image)
}
}
parent.isOpen = false
}
}
}
使用 PhotoCapturer
注意: 您将需要在物理设备上运行应用才能拍照. 模拟器上无法拍照, 且样式与物理设备上不同
swift
@State private var photoCapturerIsOpen = false
.sheet(isPresented: $photoCapturerIsOpen) {
PhotoCapturer(isOpen: $photoCapturerIsOpen, onCaptured: onImageSelected)
.ignoresSafeArea()
}