Bei VLC sass das Bild nie richtig — und der Knopf wirkte nie
Zwei Fehler, die dieselbe Ursache haben: alles, was über VLC läuft, ging
an der Bildebene vorbei, an der die App gedreht hat.
**Das Bild sass nicht mittig.** Nicht ein paar Punkte daneben — gemessen
eine Anzeigefläche von 1200×480 Punkt in einer Zeichenfläche von 711×400,
unten rechts angeschlagen, im falschen Seitenverhältnis. Der Grund steht
im Vertrag von `VLCDrawable`: VLCKit fragt die Grösse **einmal** beim
Anlegen ab und überlässt seine Anzeigefläche danach der
Autoresizing-Maske. Eine Maske hält aber den Unterschied fest, nicht das
Verhältnis — was beim Anlegen zu gross war, bleibt für immer um denselben
Betrag zu gross. Und angelegt wird sie mitten in der Drehung ins
Querformat, während SwiftUI sie einblendet: also regelmässig falsch.
Die Zeichenfläche ist jetzt eine eigene Klasse, die ihrer Anzeigefläche
bei jedem Layout wieder die eigene Grösse gibt. Danach gemessen: 695,7 ×
400 Punkt, Rand links 130,0, rechts 130,3 — mittig.
**Der Knopf für einpassen/füllen tat nichts.** Er schrieb `videoGravity`
auf eine `AVPlayerLayer`, die bei VLC gar nicht im Baum hängt. Die
Einstellung geht deshalb jetzt durch die Engine: `setVideoFit` am
Protokoll, beim Systemplayer eine Voreinstellung, die nichts tut — dort
macht es die Bildebene —, bei VLC `videoFitMode`. `smaller` heisst bei
libvlc „fit inside", `larger` „fit outside".
Gemessen, im Querformat auf einem Pro Max, über VLC:
eingepasst 695,7 × 400 pt Rand l/r 130,0/130,3 o/u 20,0/20,0
füllend 935,3 × 440 pt Rand l/r 10,3/ 10,3 o/u 0,0/ 0,0
**Zurückgenommen:** im Kommentar an `videoFit` stand, ein `didSet` auf
einer `@Observable`-Klasse werde nicht gemeldet. Das stimmt nicht —
`HomeLayoutSettings` lebt davon. Ein Kommentar, der einen falschen
Mechanismus behauptet, schickt den nächsten in die falsche Richtung;
jetzt steht der belegte Grund dort.
Dazu, damit dieser Weg überhaupt prüfbar ist: die Attrappe meldet mit
`--vlc` DTS-Ton. AVFoundation kann das nicht, also fällt die App auf
VLCKit zurück. Die Beispieldatei bleibt dieselbe — geprüft wird der Weg,
nicht der Ton. Ohne diesen Schalter ist der VLC-Zweig im Simulator gar
nicht zu erreichen, und genau deshalb lagen beide Fehler so lange da.
Ebenfalls dabei: `EdgeInsets.symmetrical` mit fünf Tests und das Polster
im Player, das damit nicht mehr verschiebt statt einrückt.
iOS und tvOS bauen, 465 Tests grün.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
51abcabb27
commit
b0db4f8f5f
@@ -848,6 +848,10 @@ struct PlayerView: View {
|
||||
// **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
|
||||
)
|
||||
|
||||
@@ -877,7 +881,13 @@ struct PlayerView: View {
|
||||
// damit, statt hinterher beschnitten zu werden.
|
||||
fläche
|
||||
.aspectRatio(CGFloat(breite) / CGFloat(höhe), contentMode: .fit)
|
||||
.padding(safeArea)
|
||||
// **Gleichgemacht, nicht roh.** Der Sicherheitsrand ist
|
||||
// unsymmetrisch — die Notch sitzt auf einer Seite. Mit den
|
||||
// rohen Werten rückt man das Bild nicht ein, man
|
||||
// **verschiebt** es um die halbe Differenz; gemessen waren
|
||||
// das vierunddreissig Punkte nach rechts und elfeinhalb nach
|
||||
// unten. Siehe `EdgeInsets.symmetrical`.
|
||||
.padding(safeArea.symmetrical)
|
||||
} else {
|
||||
fläche
|
||||
}
|
||||
@@ -903,6 +913,9 @@ struct PlayerView: View {
|
||||
private func setFit(_ neu: PlayerModel.VideoFit, on model: PlayerModel) {
|
||||
guard model.videoFit != neu else { return }
|
||||
model.videoFit = neu
|
||||
// Ausdrücklich: die Ansicht baut ihr Seitenverhältnis von selbst ab,
|
||||
// aber das Bild in der Engine liegt weiter, wie es lag.
|
||||
model.applyVideoFit()
|
||||
revealControls()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user