Bild-in-Bild gab es nur beim Weggehen — jetzt auch auf Zuruf

Du hast keinen Knopf gefunden, weil es keinen gab: `AVPictureInPictureController`
stand da, aber nur mit `canStartPictureInPictureAutomaticallyFromInline`. Das
greift, wenn man die App verlässt — und auf dem Mac gar nicht.

Der Knopf erscheint nur, wenn es wirklich ginge. Das ist nicht immer so:
`attachSurface` steigt für alles ausser `AVPlayerEngine` sofort aus, und
`AVPictureInPictureController` braucht eine `AVPlayerLayer`. Läuft ein Titel
über VLC, gibt es kein Bild-in-Bild — nur Ton im Hintergrund. Genau das war
deine Beobachtung.

**Beobachtet, nicht abgefragt.** `isPictureInPicturePossible` steht erst fest,
wenn der Player ein Bild hat; wer beim Zeichnen fragt, bekommt `false` und
zeichnet den Knopf nie wieder. Also meldet es sich über KVO — vom
Input-Thread, deshalb der Sprung auf den Hauptakteur, wie bei den übrigen
Beobachtungen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-03 07:54:46 +02:00
co-authored by Claude Opus 5
parent 261cdee2f2
commit b1973c6890
3 changed files with 75 additions and 0 deletions
+16
View File
@@ -516,6 +516,22 @@ struct PlayerView: View {
)
}
// **Bild-in-Bild von Hand.** Automatisch geht es bisher nur beim
// Verlassen der App — und auf dem Mac gar nicht. Der Knopf
// erscheint nur, wenn es wirklich ginge: bei VLC gibt es keine
// `AVPlayerLayer`, und ohne die kann das System kein kleines Fenster
// aufziehen.
if model.canUsePictureInPicture {
Button {
model.togglePictureInPicture()
} label: {
Image(systemName: model.isPictureInPictureActive ? "pip.exit" : "pip.enter")
.font(.title3)
.padding(FlixySpacing.snug)
}
.accessibilityLabel(Text("player.pictureInPicture"))
}
if model.engine?.supportsAirPlay == true {
AirPlayButton(tint: accent)
.frame(width: 28, height: 28)