Antwort 2022:
Du musst einfach das hier tun
tableView.contentInsetAdjustmentBehavior = .never
was nicht dokumentiert ist
Seltsame subtile Besonderheit ->
Tableviews haben heutzutage ein sehr eigenartiges Verhalten:
-
Auf Geräten mit einer Kerbe (XR, etc) wird ohne es dir zu sagen mehr Einrückung hinzugefügt ABER NUR WENN die Tabelle am physischen oberen Rand des Bildschirms startet.
-
Wenn du NICHT am oberen Rand des Bildschirms startest, wird es das nicht tun, aber
-
Beide Fälle sind >> nicht verwandt << zu safeAreaInsets
....... was sehr verwirrend ist
All das ist völlig undokumentiert ... du kannst Stunden damit verschwenden, das herauszufinden.
Wenn du tatsächlich möchtest, dass deine Messungen tatsächlich vom oberen Rand des Bildschirms/Tisches aus starten,
dann gehe einfach:
tableView.contentInsetAdjustmentBehavior = .never
Ein gutes Beispiel ist natürlich, wenn du irgendeine Art von Banner oder ähnlicher Elemente über den oberen Teil einer Tabelle hinzufügst, was heutzutage üblich ist, und du einfach die obere Einrückung der Tabelle auf die Höhe einstellst, die dein Banner/etc hat, wenn es läuft.
Um das zu tun, musst du den
tableView.contentInsetAdjustmentBehavior = .never
Aufruf verwenden :/
Bonus Besonderheit
Vergiss nicht, dass heutzutage fast immer Informationen (Benutzerbilder, Beschreibungen, etc.) dynamisch geladen werden, sodass du solche Werte nicht auf den endgültig benötigten Wert setzen kannst, bis die Informationen ankommen. Ein weiterer Hinweis. :/
Du hättest also Code wie:
func setTableOffsetOnceFlagAreaSizeIsKnown() {
tableView.contentInset.top = yourSpecialFlagViewUpTop.bounds.height
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
setTableOffsetOnceFlagAreaSizeIsKnown()
}