【发布时间】:2020-04-22 21:54:49
【问题描述】:
我通过在sheet 修饰符中使用逻辑来在我的应用程序中呈现UIImagePickerController。简而言之,以下三种类型处理在 UIViewControllerRepresentable 类型内显示和关闭 UIImagePickerController 的实例,这可以按预期工作:
struct DetailsView: View {
enum Sheet: Hashable, Identifiable {
case takePhoto
var id: Int { hashValue }
}
@State private var activeSheet: Sheet?
var body: some View {
Text("Hello, World!")
.sheet(item: $activeSheet) { (sheet) in self.view(for: sheet) }
}
private func view(for sheet: Sheet) -> some View {
switch sheet {
case .takePhoto: return PhotoSelectionView(showImagePicker: .init(get: { sheet == .takePhoto }, set: { (show) in self.activeSheet = show ? .takePhoto : nil }), image: $selectedImage, photoSource: .camera).edgesIgnoringSafeArea(.all)
}
}
}
struct ImagePicker: UIViewControllerRepresentable {
@Binding var isShown: Bool
@Binding var image: Image?
let photoSource: PhotoSource
func makeCoordinator() -> ImagePickerCoordinator {
return ImagePickerCoordinator(isShown: $isShown, selectedImage: $image)
}
func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {
}
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let imagePicker = UIImagePickerController()
if photoSource == .camera, UIImagePickerController.isSourceTypeAvailable(.camera) {
imagePicker.sourceType = .camera
imagePicker.cameraCaptureMode = .photo
}
imagePicker.delegate = context.coordinator
return imagePicker
}
}
class ImagePickerCoordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
@Binding private var isShown: Bool
@Binding private var selectedImage: Image?
init(isShown: Binding<Bool>, selectedImage: Binding<Image?>) {
_isShown = isShown
_selectedImage = selectedImage
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
// handle photo selection
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
dismiss()
}
}
我遇到的问题是相机视图是模态显示的,它没有覆盖整个屏幕。这会导致UIImagePickerController 有时在相机是源时出现布局损坏,就好像相机不是以这种方式呈现的一样。设置imagePicker.modalPresentationStyle = .fullScreen 不会导致全屏演示。
如何以全屏布局显示相机,使其不会出现在卡片式演示样式中?
【问题讨论】:
-
在非 SwiftUI 应用程序中,您可以通过设置所呈现视图的
modalPresentationStyle来控制它。但这不适用于sheet。没有地方可以指定演示样式(并且尝试在UIImagePickerController上设置它不起作用)。请参阅stackoverflow.com/a/58970681/1271826 了解可能的解决方法。 -
只是一个友好的建议:将来如果您可以发布MCVE 可能会很有用。像
PhotoSelectionView和PhotoSource这样的东西在这里没有定义,这使得很难表现出问题,从而推断出发生了什么。如果您共享足够的代码来重现相关问题,您将来可能会收到更多回复... -
@Rob,您提供的 URL 很有帮助,因为我错过了
UIHostingController可用于表示 SwiftUI 视图层次结构的概念。另外,我很欣赏创建 MCVE 的建议。我应该从我的原始代码示例中删除PhotoSelectionView和PhotoSource。 -
在 SwiftUI 中没有简单的方法来显示全屏 UIImagePicker 真是太疯狂了
标签: swiftui uiimagepickercontroller