From 46b011798436adcce5cdaad2ea17ad884c9bbec7 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Thu, 1 Oct 2026 07:55:50 +0200 Subject: [PATCH] =?UTF-8?q?F=C3=BCllend=20heisst=20f=C3=BCllend=20?= =?UTF-8?q?=E2=80=94=20der=20schwarze=20Streifen=20unten=20ist=20weg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Im Füllmodus wurde die Bildebene unten um den Sicherheitsrand eingerückt, damit die Untertitel nicht unter die Bildschirmkante geraten. Das stand dort unbedingt — auch wenn gar kein Untertitel lief. Übrig blieb dann ein schwarzer Streifen unter einem Bild, das gerade füllen soll: genau das Gegenteil dessen, wofür der Knopf da ist. Der Einzug hängt jetzt daran, ob überhaupt eine Untertitelspur gewählt ist. Ohne Untertitel reicht das Bild bis an alle vier Kanten, mit Untertiteln bleibt die Schrift gerettet. Gemessen auf einem Pro Max, füllend, ohne Untertitel: hochkant 440 × 956 pt Rand 0,0 / 0,0 / 0,0 / 0,0 quer 956 × 440 pt Rand 0,0 / 0,0 / 0,0 / 0,0 `PlayerModel.subtitleBottomInset` fällt weg. Die Eigenschaft beschrieb diese Rechnung, las sie aber niemand — die Ansicht rechnete selbst. Eine Beschreibung, die nichts beschreibt, zeigt beim nächsten Mal in die falsche Richtung. **Nicht geprüft:** wie es mit eingeschalteten Untertiteln aussieht. Die Attrappe liefert keine Untertitelspur, und ohne eine lässt sich der Fall im Simulator nicht herstellen. Der Weg ist unverändert geblieben, aber belegt ist er damit nicht. iOS und tvOS bauen, 463 Tests grün. Co-Authored-By: Claude Opus 5 --- Flixy/Views/Player/PlayerModel.swift | 9 --------- Flixy/Views/Player/PlayerView.swift | 19 +++++++++++-------- Flixy/Views/Player/VideoSurface.swift | 4 ++-- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/Flixy/Views/Player/PlayerModel.swift b/Flixy/Views/Player/PlayerModel.swift index 73919d8..83649c1 100644 --- a/Flixy/Views/Player/PlayerModel.swift +++ b/Flixy/Views/Player/PlayerModel.swift @@ -188,15 +188,6 @@ final class PlayerModel { /// `applyVideoFit()`. var videoFit: VideoFit = .fit - /// Wie viel unten ausgespart bleibt, damit Untertitel sichtbar sind. - /// - /// Im Füllmodus reicht das Bild über die untere Bildschirmkante hinaus — - /// und genau dort zeichnet AVFoundation die Untertitel. Statt sie - /// anzuschneiden, wird die **Bildebene** eingerückt: das kostet rund - /// zwanzig Punkt Bild und behält die Schrift. Im eingepassten Modus ist - /// der Wert null, weil dort ohnehin schwarze Balken liegen. - var subtitleBottomInset: CGFloat = 0 - /// Wo das Bild aufhört. /// /// Liegt bei `FlixyPlayback`, weil beide Engines es brauchen. Der Name diff --git a/Flixy/Views/Player/PlayerView.swift b/Flixy/Views/Player/PlayerView.swift index faf8da6..26c05fc 100644 --- a/Flixy/Views/Player/PlayerView.swift +++ b/Flixy/Views/Player/PlayerView.swift @@ -845,14 +845,17 @@ struct PlayerView: View { engine: model.engine, surface: model.surface, isActive: playback.presentation == .full, - // **Nur im Füllmodus.** Eingepasst liegt das Bild seit - // Neuestem ohnehin im sicheren Bereich — dort kann kein - // Untertitel mehr unter die Kante geraten. - // Im Füllmodus läuft das Bild bis an die Kanten; damit der - // Untertitel nicht darunter gerät, wird die **Ebene** unten - // eingerückt. Der rohe Wert genügt hier — es geht um die - // Bildschirmkante, nicht um die Mitte. - bottomInset: model.videoFit == .fill ? safeArea.bottom : 0 + // **Nur im Füllmodus, und nur wenn ein Untertitel läuft.** + // + // Füllend reicht das Bild über die untere Bildschirmkante hinaus, + // und genau dort zeichnet AVFoundation die Untertitel; die Ebene + // unten einzurücken rettet die Schrift. Läuft aber keiner, rettet + // es nichts — dann bleibt bloss ein schwarzer Streifen unter + // einem Bild, das gerade füllen soll. Das ist das Gegenteil + // dessen, wofür der Knopf da ist. + bottomInset: model.videoFit == .fill && model.selectedSubtitleTrack != nil + ? safeArea.bottom + : 0 ) // **Im Füllmodus kein Seitenverhältnis.** Die Fläche soll den Schirm diff --git a/Flixy/Views/Player/VideoSurface.swift b/Flixy/Views/Player/VideoSurface.swift index a6107ba..d9cf7b3 100644 --- a/Flixy/Views/Player/VideoSurface.swift +++ b/Flixy/Views/Player/VideoSurface.swift @@ -56,8 +56,8 @@ struct VideoSurface: View { /// Wie viel unten frei bleibt, damit Untertitel nicht abgeschnitten werden. /// - /// Siehe `PlayerModel.subtitleBottomInset`. Hier steht nur die Zahl; was - /// sie bedeutet, entscheidet das Modell. + /// Hier steht nur die Zahl; wann sie ungleich null ist, entscheidet + /// `PlayerView.surface(for:)`. var bottomInset: CGFloat = 0 var body: some View {