ios - SwiftUI - 如何处理相机权限?
问题描述
我的 ImagePicker 按预期工作。但是,我正在尝试实现相机权限处理,但我似乎陷入了困境。我收到错误消息:“函数预期返回 UIImagePickerController 中缺少返回”,这是理所当然的。我不确定我还能在哪里放置 switch 语句来执行处理。任何帮助表示赞赏。
struct ImagePicker: UIViewControllerRepresentable {
var sourceType: UIImagePickerController.SourceType = .photoLibrary
@Binding var selectedImage: UIImage
@Binding var alertCameraAccessNeeded: Bool
@Environment(\.presentationMode) private var presentationMode
@EnvironmentObject private var userManager: UserManager
let cameraAuthStatus = AVCaptureDevice.authorizationStatus(for: .video)
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
switch cameraAuthStatus {
case .notDetermined: requestCameraPermission()
case .authorized:
let imagePicker = UIImagePickerController()
imagePicker.delegate = context.coordinator
imagePicker.allowsEditing = true
imagePicker.sourceType = sourceType
return imagePicker
case .restricted, .denied: self.alertCameraAccessNeeded = true
@unknown default:
fatalError()
}
}
func requestCameraPermission() {
AVCaptureDevice.requestAccess(for: .video, completionHandler: {accessGranted in
guard accessGranted == true else { return }
})
}
func makeCoordinator() -> Coordinator {
Coordinator(self, userManager: userManager)
}
func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {
}
class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
let parent: ImagePicker
let userManager: UserManager
init(_ parent: ImagePicker, userManager: UserManager) {
self.parent = parent
self.userManager = userManager
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[.editedImage] as? UIImage {
parent.selectedImage = image
userManager.uploadProfilePicture(image: image)
}
parent.presentationMode.wrappedValue.dismiss()
}
}
}
解决方案
为了回应您的评论,想知道如何请求权限并仅有条件地显示图像选择器,这里有一个简单的示例,它允许您强制执行操作(例如,设置 @State 变量)或有条件地显示视图,如果你有权限。
在 中请求权限onAppear
,但也可以移动到按钮按下或类似的东西。
class CameraManager : ObservableObject {
@Published var permissionGranted = false
func requestPermission() {
AVCaptureDevice.requestAccess(for: .video, completionHandler: {accessGranted in
DispatchQueue.main.async {
self.permissionGranted = accessGranted
}
})
}
}
struct ContentView: View {
@StateObject var cameraManager = CameraManager()
var body: some View {
VStack {
Text("Hello, world")
if cameraManager.permissionGranted {
//show a conditional view only if you have permission
}
}
.onReceive(cameraManager.$permissionGranted, perform: { (granted) in
if granted {
//show image picker controller
}
})
.onAppear {
cameraManager.requestPermission()
}
}
}
推荐阅读
- python - 为特定列中的每个唯一值创建所有其他列的列
- java - Intellij Idea 全文搜索仅在单元和集成测试类中?
- ios - 更改约束的第二项会将常量更改为负值
- symfony4 - 仅上传 PDF 文件时出现 CORS 问题
- azure - 带有 MessageReceiver 和 .NET 5 的 Azure 函数?
- asp.net-mvc - mvc中的布局控制器,不确定实现
- paypal - PayPal REST API v2/checkout/orders 在批准后不会重定向回来
- reactjs - 反应多阶段形式的记忆开关选择
- transformer - 推断张量引擎时Aoborted(核心转储)?
- python - Slicing where stop is larger than the string length