Код: Выделить всё
import SwiftUI
import PhotosUI
struct HomeView: View {
@State private var documentViewIsPresented = false
@State private var photosPickerIsPresented = false
@State private var selectedPhotosPickerItem: PhotosPickerItem?
@State private var selectedPhotosPickerItemData: Data?
var body: some View {
ZStack {
Color.green.ignoresSafeArea()
VStack {
Button("Add Image") {
photosPickerIsPresented = true
}
}
.photosPicker(isPresented: $photosPickerIsPresented,
selection: $selectedPhotosPickerItem,
matching: .images)
.onChange(of: selectedPhotosPickerItem) {
if let selectedPhotosPickerItem = selectedPhotosPickerItem {
Task {
if let data = try? await selectedPhotosPickerItem.loadTransferable(type: Data.self) {
selectedPhotosPickerItemData = data
}
}
}
}
.onChange(of: selectedPhotosPickerItemData) {
if selectedPhotosPickerItemData != nil {
documentViewIsPresented = true
}
}
.fullScreenCover(isPresented: $documentViewIsPresented) {
if let selectedPhotosPickerItemData = selectedPhotosPickerItemData {
DocumentView(data: selectedPhotosPickerItemData)
}
}
}
}
}
struct DocumentView: View {
private(set) var data: Data
@Environment(\.dismiss) private var dismiss
var body: some View {
VStack {
if let image = UIImage(data: data) {
Image(uiImage: image)
.resizable()
.aspectRatio(contentMode: .fit)
}
HStack {
Spacer()
Button("Close") {
dismiss()
}
Spacer()
}
}
}
}
Я мог бы просто использовать обходной путь и обернуть DocumentView в ZStack и установить для него белый фон, но я заметил еще одну вещь: он неправильно форматируется в безопасных областях (если вы выберете в симуляторе изображение пещеристого потока воды, которое имеет очень большую высоту и небольшую ширину, кнопка «закрыть» будет помещена прямо под вырезом внизу).
Сначала я подумал, что это как-то связано с асинхронной загрузкой, и попробовал запустить .sheet из основного потока, но это не помогло. И мне нужно извлечь объект Data из PhotosPicker и передать его в DocumentView (а не просто изображение), потому что в моем приложении DocumentView служит большему числу целей, чем просто запуск выделений из PhotosPicker.
Это ошибка или я делаю что-то не так в коде?
Подробнее здесь: https://stackoverflow.com/questions/797 ... -area-when
Мобильная версия