iOS 14 hat SwiftUI GeometryReader geändert (oder defekt?)

Sep 17 2020

Ab der heutigen Version von iOS 14.0 funktioniert mein iOS-Code, dessen Layout stark von GeometryReader abhängt, nicht mehr richtig. Das heißt, das Layout wurde irgendwie zufällig ausgewählt.

Im Xcode-Debugger habe ich denselben Code unter iOS 13.6 mit iOS 14.0 verglichen und festgestellt, dass das Problem darin besteht, dass die GeometryProxy-Struktur in iOS 14.0 nicht initialisiert wird.

Im Beispielcode unter der Variablen g hat ein GeometryProxy in iOS 13 gültige Werte für Breite und Höhe, in iOS 14 jedoch alle Nullen. (Dies ist nur eine der einfacheren Verwendungen von GeometryProxy-Werten - ich würde mich freuen, wenn niemand weist auf die offensichtliche Tatsache hin, dass dieses Snippet auf andere Weise viel einfacher zu erreichen ist.)

Ist dies eine Änderung am GeometryReader oder ein Fehler? Hat jemand eine Problemumgehung? Habe ich je nach GeometryReader einen großen Fehler beim dynamischen Layout gemacht?

struct TextView: View {
  @EnvironmentObject var data: RecorderData
  let m = MusicalNote()

  var body: some View {
      GeometryReader { g in
          Stack(alignment: .leading) {
              Text(self.data.curNote.getString())
                 .font(.system(size: g.size.height / 2.4))
                 .padding(.bottom)
              Text(self.data.fdata.fingerings[self.data.curRecorder.id] ![self.data.curNote.seq] ![self.data.curFingType] ![self.data.currentFingeringChoice].comment)
                 .font(.headline)
        }
      Spacer()
    }
  }
}

Antworten

4 GraemeFoster Sep 20 2020 at 12:56

Es hat sich definitiv geändert - dieser Beitrag fasst es zusammen: https://swiftui-lab.com/geometryreader-bug/

GeometryReader legt seinen Inhalt jetzt anders an als früher. Früher wurde es horizontal und vertikal im übergeordneten Element zentriert, jetzt wird es oben links ausgerichtet.

Meine App sieht schrecklich aus - was frustrierend ist, ist nicht klar, ob dies ein neues Verhalten ist und wie geplant ist oder ob es ein Fehler ist und behoben wird. Ich versuche, meine App zu durchsuchen und Offsets manuell anzuwenden, aber die Dynamik von Layouts mit GeometryReader bedeutet, dass dies nicht immer einfach ist.

1 AndrewLipscomb Sep 28 2020 at 01:19

Bearbeiten meiner vorherigen Antwort als jetzt offensichtlich schlechter Rat

Von https://developer.apple.com/documentation/xcode-release-notes/xcode-12-release-notes

Durch die Neuerstellung für die SDKs iOS 14, macOS 11, watchOS 7 und tvOS 14 wird die Verwendung von GeometryReader geändert, um die Ansichten im GeometryReader zuverlässig nach oben auszurichten. Dies war das vorherige Verhalten, es sei denn, es war nicht möglich, eine einzelne statische Ansicht im GeometryReader zu erkennen. (59722992) (FB7597816)

Was zumindest für mich besagt, dass das vorherige Verhalten nach ihren Maßstäben fehlerhaft war - obwohl es den Konventionen für andere Layout-Container wie z VStack. Und dass dieses Verhalten die neue Normalität ist.