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:
Scarriffle
2026-09-29 17:32:50 +02:00
co-authored by Claude Opus 5
parent 6326c8c24c
commit 22f824b000
4 changed files with 98 additions and 62 deletions
@@ -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)
}
}