Nav bar: always show gas-pump icon next to title (inline mode); remove scroll-offset row hack

This commit is contained in:
FuelBoard Contributor
2026-08-11 21:54:56 +01:00
parent 12cb3707b6
commit 644342ae63
+1 -29
View File
@@ -22,23 +22,10 @@ struct StationsView: View {
/// which station is "best". /// which station is "best".
@State private var pageSize = 10 @State private var pageSize = 10
@State private var visibleCount = 10 @State private var visibleCount = 10
/// True once the list has scrolled drives the compact gas-pump+title bar
/// in the nav bar (large title is shown at rest, bar only after scrolling).
@State private var isScrolled = false
var body: some View { var body: some View {
NavigationStack { NavigationStack {
List { List {
GeometryReader { proxy in
Color.clear.preference(
key: ScrollOffsetKey.self,
value: proxy.frame(in: .named("stationsScroll")).minY
)
}
.frame(height: 0)
.listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
.listRowSeparator(.hidden)
Section { Section {
if let location { if let location {
if sortMode == .closest { if sortMode == .closest {
@@ -193,23 +180,17 @@ struct StationsView: View {
// New fetch or filter switch back to the first page. // New fetch or filter switch back to the first page.
visibleCount = pageSize visibleCount = pageSize
} }
.coordinateSpace(name: "stationsScroll")
.onPreferenceChange(ScrollOffsetKey.self) { minY in
isScrolled = minY < 0
}
.toolbar { .toolbar {
ToolbarItem(placement: .principal) { ToolbarItem(placement: .principal) {
if isScrolled {
HStack(spacing: 6) { HStack(spacing: 6) {
Image(systemName: "fuelpump.fill") Image(systemName: "fuelpump.fill")
.foregroundStyle(selectedFuel.tintColor) .foregroundStyle(selectedFuel.tintColor)
Text("FuelBoard") Text("FuelBoard")
.font(.headline) .font(.headline)
} }
.transition(.opacity)
}
} }
} }
.navigationBarTitleDisplayMode(.inline)
.navigationTitle("FuelBoard") .navigationTitle("FuelBoard")
} }
} }
@@ -217,15 +198,6 @@ struct StationsView: View {
// MARK: - Fuel-type iconography (app target only FuelStore.swift is Foundation-only) // MARK: - Fuel-type iconography (app target only FuelStore.swift is Foundation-only)
/// Scroll offset preference the zero-height row at the top of the List
/// reports its position so we know when the large title has collapsed.
private struct ScrollOffsetKey: PreferenceKey {
static var defaultValue: CGFloat = 0
static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
value = nextValue()
}
}
extension FuelType { extension FuelType {
/// Short segment label ("Unleaded" / "Premium" / "Diesel") for the picker. /// Short segment label ("Unleaded" / "Premium" / "Diesel") for the picker.
var shortName: String { var shortName: String {