Füllend heisst füllend — der schwarze Streifen unten ist weg
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 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
9e7f3393b4
commit
46b0117984
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user