import UIKit /// Das Fenster auf dem Mac ins Vollbild und zurück. /// /// **Und warum das umständlich ist.** Für eine „für iPad angepasste" App gibt /// es dafür keine öffentliche Schnittstelle. UIKit kennt `isFullScreen` nur /// lesend und nur für Mac Catalyst; einen Umschalter gibt es nirgends. Das /// Fenster gehört AppKit, und an AppKit kommt diese App nicht heran. /// /// Was bleibt, ist die **Antwortkette**: `toggleFullScreen:` ist die Aktion, /// die auch der grüne Knopf und ⌃⌘F auslösen, und UIKit reicht unbeantwortete /// Aktionen an das tragende AppKit-Fenster weiter. Ob es das tut, ist /// nirgends zugesagt. /// /// **Deshalb wird vorher gefragt, nicht hinterher gehofft.** /// `target(forAction:)` sagt, ob die Aktion jemand entgegennimmt — **ohne sie /// auszulösen**. Erst wenn es einen Empfänger gibt, erscheint der Knopf. Ein /// Knopf, der nichts tut, ist schlimmer als keiner: er lässt den Nutzer an /// sich zweifeln statt an der Plattform. @MainActor enum MacFullScreen { private static let action = NSSelectorFromString("toggleFullScreen:") /// Ob es hier überhaupt jemanden gibt, der umschalten kann. /// /// Bei jedem Zeichnen gefragt statt einmal gemerkt: die Antwortkette /// hängt am gerade aktiven Fenster, und ein einmal ermittelter Wert wäre /// falsch, sobald es keins gibt — etwa vor dem ersten Erscheinen. static var isAvailable: Bool { UIApplication.shared.target(forAction: action, withSender: nil) != nil } /// Schaltet um. Gibt zurück, ob jemand zugehört hat. @discardableResult static func toggle() -> Bool { UIApplication.shared.sendAction(action, to: nil, from: nil, for: nil) } }