Auf deinem vierten Bild steht „Ziehe Objekte zur Seiten- oder Tableiste, um sie anzupassen". Das ist kein Text, den jemand geschrieben hat, sondern einer von Apple. JellyTV benutzt dort `TabView` mit `sidebarAdaptable` — und damit ist die Frage, wie die das hinbekommen, beantwortet: gar nicht, das System macht es. Meine drei selbstgebauten Formen fliegen dafür raus: das ausfahrbare Blatt, die geteilte Ansicht und die Reihe oben, die ich vor einer Stunde noch selbst gebaut habe. Zusammen konnten sie weniger als das eine Bauteil und mussten dreimal gepflegt werden. Was jetzt vom System kommt: - die Seitenleiste aus Glas, mit dem Inhalt **dahinter** statt daneben - der Knopf in ihrer Kopfzeile, der zwischen Seitenleiste und Leiste **oben** umschaltet — genau der, den du auf deinen Bildern siehst - „Bearbeiten" mit Ziehen, Ein- und Ausblenden, für beide Formen gleichzeitig - auf dem iPhone die gewohnte Leiste unten statt eines Hamburger-Menüs Die Einstellung „seitlich oder oben" entfällt damit: sie säße neben einem Systemknopf, der dasselbe besser kann. Was du umstellst, merkt sich das System selbst; wir geben ihm nur einen Ort zum Aufbewahren. Die Mediatheken stehen in einem eigenen Abschnitt, der sich in der Seitenleiste zuklappen lässt. Die Suche bekommt ihre eigene Rolle und wird deshalb getrennt von den übrigen Einträgen dargestellt. Angesehen auf iPad (Seitenleiste, Leiste oben, Bearbeiten-Dialog) und iPhone. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
50 lines
1.5 KiB
Swift
50 lines
1.5 KiB
Swift
import Foundation
|
|
|
|
/// Was in der Seitenleiste steht.
|
|
///
|
|
/// Die Mediatheken kommen erst zur Laufzeit vom Server, deshalb trägt
|
|
/// `library` den Schlüssel des Abschnitts statt eines festen Falls.
|
|
enum SidebarDestination: Hashable {
|
|
case home
|
|
case library(key: String, title: String)
|
|
case search
|
|
case liveTV
|
|
case downloads
|
|
case settings
|
|
|
|
/// Der Titel in der Navigationsleiste.
|
|
///
|
|
/// Auf der Startseite steht dort der Name der App — in der Seitenleiste
|
|
/// wäre das nur eine Dopplung der Überschrift, deshalb hat sie mit
|
|
/// `sidebarLabel` einen eigenen Text.
|
|
var title: String {
|
|
switch self {
|
|
case .home: Branding.appName
|
|
case .library(_, let title): title
|
|
case .search: String(localized: "search.title")
|
|
case .liveTV: String(localized: "sidebar.liveTV")
|
|
case .downloads: String(localized: "sidebar.downloads")
|
|
case .settings: String(localized: "sidebar.settings")
|
|
}
|
|
}
|
|
|
|
/// Die Beschriftung in der Seitenleiste.
|
|
var sidebarLabel: String {
|
|
switch self {
|
|
case .home: String(localized: "sidebar.home")
|
|
default: title
|
|
}
|
|
}
|
|
|
|
var symbol: String {
|
|
switch self {
|
|
case .home: "house"
|
|
case .library: "film"
|
|
case .search: "magnifyingglass"
|
|
case .liveTV: "dot.radiowaves.left.and.right"
|
|
case .downloads: "arrow.down.circle"
|
|
case .settings: "gearshape"
|
|
}
|
|
}
|
|
}
|