Хорошо, примите этот ответ с большим количеством соли. Я, вероятно, буду за это осужден и за это все мои дети-кодеры со мной ... Но так же и Apple за то, что она не предоставляет простой способ представить полноэкранный UIImagePickerController в SwiftUI.
очень плохо хитрость заключается в том, чтобы создать свой инструмент выбора в rootView и игнорировать его в безопасной области. Затем вы передаете все необходимые параметры в качестве привязок к представлению, нуждающемуся в imagePicker
struct mainView: View {
@State private var imagePicked = UIImage()
@State private var showImagePicker = false
@State private var pickerSource = UIImagePickerController.SourceType.camera
var body: some View {
ZStack {
AvatarView(showImagePicker: self.$showImagePicker, pickerSource: self.$pickerSource , imagePicked: self.$imagePicked)
if self.showImagePicker {
ImagePickerView(isPresented: self.$showImagePicker, selectedImage: self.$imagePicked, source: .camera).edgesIgnoringSafeArea(.all)
}
}
}
}
. Конечно, ваше представление аватара будет иметь весь необходимый код для обновления этих привязок. Что-то вроде этого
HStack () {
Button(action: {
self.showActionSheet.toggle()
}) {
MyImageView(image: self.imagePicked)
}
.actionSheet(isPresented: $showActionSheet, content: {
ActionSheet(title: Text("Picture source"), buttons: [
.default(Text("Camera"), action: {
self.pickerSource = .camera
self.showImagePicker.toggle()
}),
.default(Text("Photo Library"), action: {
self.pickerSource = .photoLibrary
self.showImagePicker.toggle()
}),
.destructive(Text("Cancel"))
])
})
}
Честно говоря, я не решался предоставить это решение, этот код заставляет меня кровоточить, но я подумал, что кто-то может иметь лучшую идею при чтении этого и предоставил действительно чистый SwiftUI способ сделать это.
Хорошая особенность этого решения в том, что оно хорошо справляется с изменениями ориентации, и давайте посмотрим правде в глаза, UIImagePickerController не умещается должным образом на листе. Это нормально для фото-библиотеки, но не для камеры.