일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 달력
- fullscreencover
- Concurrency
- firebase
- GCD
- Network
- Performance
- iphone
- auth
- 네트워크
- UIKit
- dataflow
- combine
- authentication
- 데이터최적화
- arkit
- WWDC
- gesture
- ios
- CS
- withAnimation
- RxSwift
- SwiftUI
- ar
- Animation
- stateobject
- environmentobjet
- swift
- realitykit
- state
- Today
- Total
XLOG
[SwiftUI] Scroll Value 구하기 본문
사용할 방법은 GeometryReader 와 preference 를 이용한다.
그러기 위해 우리는 GeometryReader 를 먼저 알아야 한다.
GeometryReader는 컨테이너 뷰가 가지고 있는 사이즈, 좌표공간을 반환해주는 함수 이다.
그렇다면 preference 란 무엇일까?
주어진 preference(선호?)로 값을 set 해준다는게 무슨 말일까…..
이것은 SwiftUI 가 view의 사이즈, 위치를 어떻게 결정을 하는지에 대한 원리에 대한 이해가 필요하다.
자세히 작성을 하다보면 내용이 너무 길어진다. 그냥 간단하게 보통 상위뷰에서 하위뷰로 데이터를 전달하는데 가끔 우리는 하위뷰에서 상위뷰로 데이터를 전달을 하고 싶을 때가 생긴다. 그때 하위뷰가 원하는(선호하는) 데이터(사이즈, 위치 등)를 전달할때 사용을 하는 것이다.
그럼 의미를 알았으니 저 두가지를 사용하여 우리가 스크롤을 할때 스크롤된 데이터를 어떻게 구할까?
간단하게 순서를 정한다면
- preference에 사용할 key를 정의해준다.(preferencekey 프로토콜과 함께)
- GeometryReader를 이용하여 Scrollview 내부에서 스크롤에 따라 위치값을 받아올 수 있는 View 를 만든다.
- 그 View의 preference의 값을 변화시켜준다.
- onPreferenceChange를 이용하여 preference 값을 가져온다.
//preferencekey로 사용할 struct
struct ViewOffsetKey: PreferenceKey {
typealias Value = CGFloat
static var defaultValue = CGFloat.zero
static func reduce(value: inout Value, nextValue: () -> Value) {
value += nextValue()
}
}
//some View 내부
ScrollView() {
ForEach() {
....
}
}
// background가 아니라도 사용 가능
.background( Geometry {
Color.clear.preference(key: ViewOffsetKey.self, value: -$0.frame(in: .named("scroll")).origin.y)
})
.onPreferenceChange(ViewOffsetKey.self) {
// $0 이 스크롤 된 값
print($0)
}
참고
https://stackoverflow.com/questions/62588015/get-the-current-scroll-position-of-a-swiftui-scrollview
https://protocorn93.github.io/tags/PreferenceKey/
https://velog.io/@kipsong/SwiftUI-Preference-Key-coordinatespace
https://ios-development.tistory.com/1166
https://swiftwithmajid.com/2020/01/15/the-magic-of-view-preferences-in-swiftui/
'Swift > SwiftUI' 카테고리의 다른 글
[SwiftUI] QR Code Scanner 만들기 (SwifUI 에 ViewController 사용하기) (1) | 2023.03.08 |
---|---|
[SwiftUI] 날짜 계산, 월간달력 만들기 (0) | 2023.03.04 |
[SwiftUI] 캘린더용 InfinityScroll 로직에 대한 아이디어 (0) | 2023.02.27 |
[SwiftUI] onAppear 에서 async 함수 실행하기 (0) | 2023.02.18 |
[SwiftUI] ImageResize 후 onTapGesture 적용시 터치영역 버그 (0) | 2023.01.30 |