簡體   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
            }
        }
    }
}

我想在 SwiftUI 中 TabView 滾動時獲得水平偏移。

在 UIKit 中有類似的東西。

func scrollViewDidScroll(_ scrollView: UIScrollView) {
  parent.offset = scrollView.contentOffset.x
}

要跟蹤任何視圖的偏移量,以及TabView的視圖,您可以使用Overlay + GeometryReader

OffsetProxy作為疊加層添加到您感興趣的偏移視圖

struct OffsetProxy: View {
    var body: some View {
        GeometryReader { proxy in
            Color.clear
                .preference(key: OffsetKey.self, value: proxy.frame(in: .global).minX)
        }
    }
}

然后就可以在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