我有一个复杂的视图,其中包括一个ScrollView
,我试图在用户开始滚动时隐藏tabBar和navigationBar,并在用户停止滚动时再次显示它们(有点像Apollo iOS for Reddit应用程序)。
但是,它不起作用,我知道为什么。下面是我的代码:
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))
}
}
}
先谢谢你了!
1条答案
按热度按时间evrscar21#
我创建了一些演示,你可以显示或隐藏工具栏的滚动方向和滚动范围的基础上。数字是实验性的,你可以找到你的甜蜜点。