Die Ränder kommen jetzt von der Stelle, die sie kennt
Mein voriger Versuch war an der Quelle falsch, nicht an der Rechnung. **Was ich gebaut hatte:** die Sicherheitsränder in `RootView` messen und über die Umgebung an den Player reichen. Gemessen in einer Ansicht, angewendet in einer anderen, über eine Drehung hinweg — drei Gelegenheiten, daneben zu liegen. Im Simulator ging es gut, auf dem Gerät nicht: dort standen im Querformat links 75 und rechts 28 Punkt Rand, und der Untertitel wurde von der Bildschirmkante abgeschnitten. **Warum SwiftUI hier nicht hilft.** Der Sicherheitsrand ist dort kein Wert, den man erfragt, sondern einer, den man verbraucht: wer ihn respektiert, sieht null, und wer ihn mit `ignoresSafeArea` überschreitet, sieht danach ebenfalls null. Beide Auswege habe ich durchgespielt und beide gemessen. Nimmt man der Ansicht das `ignoresSafeArea`, sitzen die Knöpfe richtig — aber die Bildfläche verliert es mit, und das Bild ist im Querformat um die Notch-Breite schmaler. Schiebt man einen `GeometryReader` dazwischen, passiert dasselbe. **Das Fenster weiß es immer**, in der richtigen Ausrichtung und in dem Moment, in dem gefragt wird. `ScreenSafeArea` ist die eine Stelle in dieser App, die so fragt, und die eine, an der es keinen SwiftUI-Weg gibt. Nachgeholt wird der Wert bei jeder Änderung der Fläche — das ist genau der Moment des Drehens. Nachgemessen im Simulator gegen die Jellyfin-Attrappe: im Querformat meldet das Fenster 0/62/62/20, und damit stehen Kopfzeile, Schieberegler und Zeitangaben vollständig im sichtbaren Bereich, während das Bild bis an die Kanten reicht. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
6326c8c24c
commit
22f824b000
@@ -1,28 +0,0 @@
|
||||
import SwiftUI
|
||||
|
||||
/// Die Sicherheitsränder des Bildschirms — gemessen, wo es sie noch gibt.
|
||||
///
|
||||
/// **Warum das überhaupt nötig ist.** Der Player deckt das ganze Fenster ab
|
||||
/// und bekommt dafür `ignoresSafeArea()`. Innerhalb dieser Ansicht sind die
|
||||
/// Sicherheitsränder danach **null**: SwiftUI hat sie aufgebraucht, und wer
|
||||
/// weiter innen danach fragt, bekommt eine ehrliche Antwort auf die falsche
|
||||
/// Frage. Die Bedienelemente sassen dadurch im Home-Indikator und die
|
||||
/// Kopfzeile hinter der Dynamic Island.
|
||||
///
|
||||
/// Gemessen wird deshalb weiter aussen — dort, wo die Ränder noch gelten —
|
||||
/// und über die Umgebung nach innen gereicht. Dieselbe Bauart wie
|
||||
/// `flixyAccent`: ein Wert, den die Wurzel kennt und alle anderen lesen.
|
||||
///
|
||||
/// Nicht zu verwechseln mit `safeAreaPadding`: das würde den Player wieder
|
||||
/// verkleinern. Hier bleibt das Bild bildfüllend, und nur die Schrift darauf
|
||||
/// rückt ein.
|
||||
extension EnvironmentValues {
|
||||
@Entry public var flixyScreenInsets: EdgeInsets = EdgeInsets()
|
||||
}
|
||||
|
||||
extension View {
|
||||
/// Reicht gemessene Sicherheitsränder nach innen.
|
||||
public func flixyScreenInsets(_ insets: EdgeInsets) -> some View {
|
||||
environment(\.flixyScreenInsets, insets)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user