I have a List
inside a navigationView
and I want to change the List
Section
text whenever the list is scrolled and the navigationBarTitle
become .inline
or .large
This is my code:
import SwiftUI
struct ContentView: View {
@State private var scrolledUp = false
var body: some View {
NavigationView {
if scrolledUp {
List {
Section(header: Text("Moved UP"))
{
Text("Line1").bold()
Text("Line2").bold()
Text("Line2").bold()
}
.navigationBarTitle("Setting")
}
} else {
List {
Section(header: Text("Not Moved"))
{
Text("Line1").bold()
Text("Line2").bold()
Text("Line2").bold()
}
}
.navigationBarTitle("Setting")
}
}
}
}
how can I find out the list
is scrolled and the navigationBar
is changed to .title
?
Here is a rough implementation used to turn on additional nav bar items when it turns from .large
to .inline
. It is not perfect, but it is enough for some situations.
import SwiftUI
struct ContentView: View {
@State private var navIsInline = false
var body: some View {
NavigationView {
ScrollView {
ZStack {
LazyVStack {
ForEach(1..<100) { val in
Text("Hello, NavBar! \(val)")
}
}
GeometryReader { proxy in
let offset = proxy.frame(in: .named("scroll")).minY
Color.clear.preference(key: ViewOffsetKey.self, value: offset)
}
}
}
.coordinateSpace(name: "scroll")
.onPreferenceChange(ViewOffsetKey.self) { value in
print(value)
if navIsInline != (value < 0) {
navIsInline.toggle()
}
}
.navigationBarTitleDisplayMode(.large)
.navigationTitle("Nav title")
.toolbar {
if navIsInline {
ToolbarItem(placement: .navigationBarLeading) {
Text("leading")
}
ToolbarItem(placement: .navigation) {
Text("Navigation")
.font(.headline)
}
ToolbarItem(placement: .navigationBarTrailing) {
HStack {
Text("Trailing").font(.headline)
}
.padding(.horizontal)
}
}
}
//.toolbar(navIsInline ? .hidden : .visible, for: .navigationBar)
}
}
}
struct ViewOffsetKey: PreferenceKey {
typealias Value = CGFloat
static var defaultValue = CGFloat.zero
static func reduce(value: inout Value, nextValue: () -> Value) {
value += nextValue()
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With