Handschuhmodus

Entwickelt wird eine Einstellungsseite in der verschiedene Eigenschaften des UI zentral festgelegt werden können.
Dabei soll beispielsweise auch die Größe von Schaltflächen für den Gebrauch mit Handschuhen angepasst werden.
Eine weitere Idee ist die Auswahl eines alternativen Farbschemas um Kontraste zu erhöhen und auch bei schlechter Sicht (bei Schnee und Wind) in der Benutzung zu unterstützen.

Ziel

Ziel ist die Bedienbarkeit auch bei schlechten Bedingungen zu gewährleisten

  • Benutzung mit Handschuhen
  • Fehlendes Feingefühl bei Kälte

Kommunikation in der App

Um die Einstellungen innerhalb der gesamten App zu erreichen wird eine Globale Instanz der ThemeKlasse erstellt, die alle zu verwaltenden Einstellungen als Member enthält.

@main
struct Analyst_IOSApp: App {
    @State private var theme = Theme()
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(theme)
        }
    }
}

In den inneren Elementen wird die Verbindung folgendermaßen hergestellt.

struct ContentView: View {
    @Environment(Theme.self) var theme
    
	var body : some View{
		theme.attributes // ist hier erreichbar
	    // ... 
    }
}

Sichtbarkeit

Da die Variable als Environment einer äußeren Schicht gesetzt wurde, ist sie in allen Unterelementen erreichbar. Die Zeile
@Environment(Theme.self) var theme
Definiert die lokale Variable theme auf Basis der Umgebungsvariable vom Typ ´Theme´. Es kann nur eine Env-Variable von jedem Datentyp existieren.

Smarte Modifier

Ziel war es, einen Modifier foo zu erstellen, sodass Button.foo im Normalen Modus regulär aussieht und im Glovemode eine alternative Darstellung erhält.

Modifier können selbst definiert werden und auch Logik enthalten um bestimmte Formatierungen nur bedingt anzuwenden.

private struct ThemeButtonSizing : ViewModifier {
	@Environment(Theme.self) private var theme // lädt die Umgebungsvariable
	
	func body(content: Content) -> some View{
		switch theme.buttonSizeMode {
		case .normal:
			content.controlSize(baseline)
		case .glove:
			content.controlSize(.extraLarge)
		}
	}
}

Diese Funktion ist ein Wrapper um den selbst definierten Modifikator mit der .notation erreichbar zu machen.

public extension View {
	func themedButtonSize(baseline: ControlSize) -> some View {
		modifier(ThemeButtonSizing(baseline: baseline))
	}
}

Buttons

Control Sizes

Swift stellt 5 unterschiedliche Größen bereit, jedoch werden bei der Anwendung auf IOS Buttons nur drei verschiedene Varianten tatsächlich angezeigt.

Whitespace

Durch hinzufügen von längeren Texten kann der Button noch größer angezeigt werden, auch von leeren Zeilen wird die Größe angepasst.

Button {
	// Do smth with Button Press
} label: {
	Text("\n\nXtra button\n\n")
}
.buttonStyle(.borderedProminent)
.controlSize(.extraLarge)

Padding

Der Parameter setzt einen Abstand um den äußeren Rand des Elements

 Button {...}
	.buttonStyle(.borderedProminent)
	.controlSize(.regular)
 Button {...}
	.buttonStyle(.borderedProminent)
	.controlSize(.large)
	.padding(50)
Button {...}
	.buttonStyle(.borderedProminent)
	.controlSize(.extraLarge)
	.padding(.vertical, 50)