简体   繁体   English

如何获取SwiftUI中的TabView偏移量

[英]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 inOffsetProxy作为叠加层添加到您感兴趣的偏移视图

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM