Preference
하위뷰 -> 상위뷰
입니다.구현방법
private struct ScrollOffsetPreferenceKey: PreferenceKey {
static var defaultValue: CGPoint = .zero
static func reduce(value: inout CGPoint, nextValue: () -> CGPoint) {
// do something
}
}
- 1. “PreferenceKey” 를 따르는 구조체를 정의합니다.
- 2. reduce 메소드를 생성합니다.
reduce 메소드 우리가 선언한 “PreferenceKey” 를 사용하는 하위뷰를 순회합니다. 동시에, 상위뷰가 접근할 수 있는 값을 취합해줍니다.
하위뷰 코드입니다.
GeometryReader { geometry in
Color.clear.preference(
key: ScrollOffsetPreferenceKey.self,
value: geometry.frame(in: .named("scrollView")).origin
)
}
.frame(width: 0, height: 0)
- Color에 보면 .preference 를 통해서 값을 전달해주고 있습니다.
- key 는 “ScrollOffsetPreferenceKey.self” 입니다.
- value 는 “geometry.frame(in: .named(“scrollView”)).origin” 입니다.
하위뷰 전체 코드를 보면서 설명하겠습니다.
struct TrackableScrollView<Content: View>: View {
let axes: Axis.Set
let offsetChanged: (CGPoint) -> Void
let content: Content
init(axes: Axis.Set = .vertical,
offsetChanged: @escaping (CGPoint) -> Void = { _ in },
@ViewBuilder content: () -> Content) {
self.axes = axes
self.offsetChanged = offsetChanged
self.content = content()
}
var body: some View {
SwiftUI.ScrollView(axes, showsIndicators: false) {
GeometryReader { geometry in
Color.clear.preference(
key: ScrollOffsetPreferenceKey.self,
value: geometry.frame(in: .named("scrollView")).origin
)
}
.frame(width: 0, height: 0)
content
}
.coordinateSpace(name: "scrollView")
.onPreferenceChange(ScrollOffsetPreferenceKey.self,
perform: offsetChanged
)
}
}
private struct ScrollOffsetPreferenceKey: PreferenceKey {
static var defaultValue: CGPoint = .zero
static func reduce(value: inout CGPoint, nextValue: () -> CGPoint) {
}
}