[英]How to get TabView offset in SwiftUI
struct FooView: View {
@State private var offset: CGFloat = 0
var body: some View {
NavigationView {
TabView {
VStack {
Text("Tab 1")
}
VStack {
Text("Tab 2")
}
}
.SomeWatchOffsetMethod(of: offset) { value in
// I want to get horizontal offset when TabView Scrolling.
offset = value
}
}
}
}
I want to get horizontal offset when TabView Scrolling in SwiftUI.我想在 SwiftUI 中 TabView 滚动时获得水平偏移。
There are something like that in UIKit.在 UIKit 中有类似的东西。
func scrollViewDidScroll(_ scrollView: UIScrollView) {
parent.offset = scrollView.contentOffset.x
}
To track an offset of any view, as well as views of TabView
you can use Overlay
+ GeometryReader
要跟踪任何视图的偏移量,以及TabView
的视图,您可以使用Overlay
+ GeometryReader
Add an OffsetProxy
as an overlay to a view that offset you are interested in将OffsetProxy
作为叠加层添加到您感兴趣的偏移视图
struct OffsetProxy: View {
var body: some View {
GeometryReader { proxy in
Color.clear
.preference(key: OffsetKey.self, value: proxy.frame(in: .global).minX)
}
}
}
Then you can subscribe to listen the offset changes in onPreferenceChange
然后就可以在onPreferenceChange
订阅监听offset的变化
struct FooView: View {
@State private var offset: CGFloat = 0
var body: some View {
NavigationView {
TabView {
VStack {
Text("Tab")
}
.overlay(
OffsetProxy()
)
.onPreferenceChange(OffsetKey.self) { offset in
self.offset = offset
}
}
}
}
}
struct OffsetKey: PreferenceKey {
static var defaultValue: CGFloat = 0
static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
value = nextValue()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.