Code: Select all
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()
}
}
}
}
Ich könnte einfach eine Problemumgehung durchführen und DocumentView in einen ZStack einschließen und seinen Hintergrund auf Weiß setzen, aber mir ist außerdem aufgefallen, dass es innerhalb der sicheren Bereiche nicht richtig formatiert wird (wenn Sie im Simulator das Bild des höhlenartigen Wasserflusses auswählen, das eine sehr große Höhe und eine geringe Breite hat, wird die Schaltfläche „Schließen“ direkt unter der Kerbe unten platziert).
Anfangs dachte ich, es hätte etwas mit dem asynchronen Laden zu tun, und habe versucht, die .sheet-Datei vom Hauptthread aus zu starten, aber es machte keinen Unterschied. Und ich muss ein Data-Objekt aus dem PhotosPicker extrahieren und es an DocumentView übergeben (anstelle nur eines Bildes), da DocumentView in meiner App mehr Zwecken dient als nur das Starten von Auswahlen aus dem PhotosPicker.
Ist das ein Fehler oder mache ich etwas falsch im Code?
Mobile version