I have a complex view that includes a ScrollView
and I'm trying to hide both the tabBar and the navigationBar whenever the user starts scrolling, and show them again when the user stops scrolling (kind of like in the Apollo iOS for Reddit app).
However, it doesn't work and I'm sure why. Here's my code:
struct View: View {
@State var isDragging: Bool = false
@AppStorage("hideTopBarAndNavBarWhenScrolling") var hideTopBarAndNavBarWhenScrolling: Bool = false
ScrollView {
LazyVStack(spacing: 0) {
...
}
}
.hideNavBarAndTopBar(isDragging, hideTopBarAndNavBarWhenScrolling)
.simultaneousGesture(dragGesture)
}
struct HideNavBarAndTopBarModifier: ViewModifier {
var isScrollViewDragging: Bool
var hideTopBarAndNavBarWhenScrolling: Bool
func body(content: Content) -> some View {
if hideTopBarAndNavBarWhenScrolling {
Spacer()
.frame(height: 1)
.ignoresSafeArea()
content
.toolbar(isScrollViewDragging ? .visible : .hidden, for: .tabBar)
.toolbar(isScrollViewDragging ? .visible : .hidden, for: .navigationBar)
Spacer()
.frame(height: 1)
.ignoresSafeArea()
} else {
content
.toolbar(.visible, for: .tabBar)
.toolbar(.visible, for: .navigationBar)
}
}
}
extension View {
func hideNavBarAndTopBar(_ isScrollViewDragging: Bool, _ hideTopBarAndNavBarWhenScrolling: Bool) -> some View {
self.modifier(HideNavBarAndTopBarModifier(isScrollViewDragging: isScrollViewDragging, hideTopBarAndNavBarWhenScrolling: hideTopBarAndNavBarWhenScrolling))
}
}
}