USB-Meter / Documentation / Navigation Style Decisions.md
1 contributor
56 lines | 3.411kb

Navigation Style Decisions

Obiectiv

Navigația aplicației folosește stilul SwiftUI implicit, cu un singur set de modificatori aplicat consistent în toate view-urile. Nu există logică condiționată per platformă pentru controlul navigației.

Deviații de la comportamentul SwiftUI implicit

1. Titlu inline (.navigationBarTitleDisplayMode(.inline))

Aplicat pe: toate view-urile care au .navigationTitle(...).

Motivație: Implicit, SwiftUI afișează titlul mare (.large) în prima fereastră a unui NavigationStack sau NavigationView. Stilul large nu se potrivește layoutului aplicației, care folosește un tab bar custom imediat sub navigation bar — titlul mare consumă spațiu vertical fără beneficiu. Stilul inline plasează titlul centrat în toolbar, aliniind aspectul pe iPhone, iPad și Mac Catalyst.

Fișiere afectate: - Views/Meter/MeterView.swift — live body și offline body - Views/ChargedDevices/Details/ChargedDeviceDetailView.swift - Views/ChargedDevices/Sessions/ChargeSessionDetailView.swift - Views/ChargedDevices/Sessions/ChargedDeviceSessionsView.swift - Views/Meter/Tabs/Live/ChargerStandbyPowerWizardView.swift - Views/MeterMappingDebugView.swift - Views/DeviceHelpView.swift - Sheets (deja aveau .inline): ChargedDeviceEditorScaffoldView, SidebarChargedDeviceLibraryView, și altele

2. Font titlu navigation bar (19pt semibold)

Aplicat în: AppDelegate.configureNavigationBarAppearance() via UINavigationBarAppearance.

Motivație: Fontul implicit al titlului inline este .headline (17pt semibold), perceput ca prea mic față de densitatea vizuală a conținutului. 19pt semibold oferă mai multă prezență fără a afecta spațiul disponibil, întrucât titlul rămâne pe un singur rând.

Configurare: swift let titleFont = UIFont.systemFont(ofSize: 19, weight: .semibold) let appearance = UINavigationBarAppearance() appearance.configureWithDefaultBackground() appearance.titleTextAttributes = [.font: titleFont] UINavigationBar.appearance().standardAppearance = appearance UINavigationBar.appearance().scrollEdgeAppearance = appearance UINavigationBar.appearance().compactAppearance = appearance

Ce NU s-a schimbat față de implicit

  • NavigationView cu .navigationViewStyle(.stack) pe iPhone și .navigationViewStyle(.columns) pe iPad/Mac — arhitectural, nu cosmetic
  • Toolbar items (.toolbar { }) — plasate standard pe .navigationBarTrailing / .cancellationAction / .confirmationAction
  • Fundalul navigation bar — configureWithDefaultBackground() păstrează comportamentul implicit al sistemului (translucid/blur)

Istoric

Anterior existau mai multe straturi de modificatori conflictuali adăugați în tentative de a obține un layout compact "Nav Control – Title – Tools" pe Mac Catalyst și iPad: - navigationBarHidden(landscape) — ascundea bara în landscape pe Catalyst - IOSOnlyNavBar (ViewModifier) — aplica titlu și toolbar condițional pe !isTrueMacApp - macNavigationHeader și offlineMacHeader — headere custom inline în VStack care dublau controalele când bara de sistem era vizibilă - ToolbarItemGroup(placement: .primaryAction) {} gol pe Catalyst — crea artefacte vizuale

Toate au fost eliminate în aprilie 2026. Soluția corectă a fost .navigationBarTitleDisplayMode(.inline) aplicat consistent.