Ein Vollbildknopf im Player — wenn der Mac ihn annimmt
Fuer eine „fuer iPad angepasste\" App gibt es dafuer keine oeffentliche Schnittstelle. UIKit kennt `isFullScreen` nur lesend und nur fuer Catalyst; einen Umschalter gibt es nirgends. Das Fenster gehoert AppKit, und an AppKit kommt diese App nicht heran. Was bleibt, ist die Antwortkette: `toggleFullScreen:` ist dieselbe Aktion, die der gruene Knopf und Strg-Cmd-F ausloesen, und UIKit reicht unbeantwortete Aktionen an das tragende AppKit-Fenster weiter. Ob es das tut, ist nirgends zugesagt. Deshalb wird vorher gefragt statt hinterher gehofft: `target(forAction:)` sagt, ob die Aktion jemand entgegennimmt, **ohne sie auszuloesen**. Erst wenn es einen Empfaenger gibt, erscheint der Knopf. Ein Knopf, der nichts tut, ist schlimmer als keiner — er laesst den Nutzer an sich zweifeln statt an der Plattform. Das Symbol zaehlt den Zustand selbst mit, weil er sich nicht abfragen laesst. Wer mit dem gruenen Knopf umschaltet, bringt es aus dem Tritt; das Umschalten funktioniert trotzdem, es zeigt nur kurz das falsche Bild. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
4323c47db6
commit
1ff65e823a
@@ -45,6 +45,15 @@ struct PlayerView: View {
|
||||
@State private var becameActive: ContinuousClock.Instant?
|
||||
/// Wo der Zeiger zuletzt war — um Bewegung von Neuzeichnen zu trennen.
|
||||
@State private var lastPointerLocation: CGPoint = .zero
|
||||
/// Ob das Fenster gerade im Vollbild ist — soweit wir es wissen können.
|
||||
///
|
||||
/// **Selbst mitgezählt, nicht abgefragt.** `UIWindowScene.isFullScreen`
|
||||
/// gibt es für eine „für iPad angepasste" App nicht. Wer mit dem grünen
|
||||
/// Knopf oder ⌃⌘F umschaltet, bringt das Symbol also aus dem Tritt — das
|
||||
/// Umschalten selbst funktioniert trotzdem, es zeigt nur kurz das falsche
|
||||
/// Bild. Ein falsches Symbol ist der kleinere Preis gegenüber gar keinem
|
||||
/// Knopf.
|
||||
@State private var isFullScreen = false
|
||||
/// Ob Zeiger und Tastatur gelten. Einmal beim Start ermittelt.
|
||||
private var isMac: Bool { FlixyPlatform.isMac }
|
||||
|
||||
@@ -350,6 +359,27 @@ struct PlayerView: View {
|
||||
|
||||
Spacer()
|
||||
|
||||
// **Vollbild — nur auf dem Mac, und nur wenn es dort geht.**
|
||||
//
|
||||
// Ob die Aktion jemand entgegennimmt, steht nicht fest; siehe
|
||||
// `MacFullScreen`. Gefragt wird vorher, damit kein Knopf dasteht,
|
||||
// der nichts tut — das lässt den Nutzer an sich zweifeln statt an
|
||||
// der Plattform.
|
||||
if isMac, MacFullScreen.isAvailable {
|
||||
Button {
|
||||
if MacFullScreen.toggle() { isFullScreen.toggle() }
|
||||
revealControls()
|
||||
} label: {
|
||||
Image(systemName: isFullScreen
|
||||
? "arrow.down.right.and.arrow.up.left"
|
||||
: "arrow.up.left.and.arrow.down.right")
|
||||
.font(.callout.weight(.semibold))
|
||||
.padding(FlixySpacing.snug)
|
||||
}
|
||||
.accessibilityLabel(Text(isFullScreen ? "player.exitFullScreen" : "player.fullScreen"))
|
||||
.keyboardShortcut("f", modifiers: [.command, .control])
|
||||
}
|
||||
|
||||
// Getrennte Knöpfe, weil es zwei verschiedene Fragen sind: die
|
||||
// Tonspur stellt man einmal am Anfang um, die Untertitel mitten im
|
||||
// Film. Ein gemeinsames Sheet bedeutete jedes Mal Scrollen an der
|
||||
|
||||
Reference in New Issue
Block a user