iOS18+ 부터 사용가능한 ScrollView뷰 기능을 알아보려합니다
엄청 중요했던건데 이제서야 나온게 의문인 API 라고 생각합니다... ㅎ
onScrollGeometryChange
스크롤 지오메트리에서 생성된 값이 변경될 때 수행할 동작을 추가합니다.
라고 정의하네요
지금까지는 PreferenceKey를 이용해서
스크롤 offset을 찾았다면 이제 그럴 필요가없게됫죠
2022.09.07 - [iyOmSd/Title: SwiftUI] - [SwiftUI] ScrollView Offset
를 참고하세요!
새로나온 타입엔
컨테이너 사이즈
inset
offset
bounds
...등
보통 스크롤뷰를 이용해서
작업할 필요한 정보들이 다있는거같네요
이걸드디어.. 지원해주다니 슬프면서 기쁩니다
바로 사용해봅시다!
struct ContentView: View {
@State private var data: [Int] = (1...100).map { $0 }
var body: some View {
ScrollView {
ForEach(data, id: \.self) { item in
Text("\(item)")
.frame(height: 30)
Divider()
}
}
.onScrollGeometryChange(for: CGFloat.self) { geometry in
print("contentOffset", geometry.contentOffset)
print("contentInsets", geometry.contentInsets)
print("contentSize", geometry.contentSize)
print("containerSize", geometry.containerSize)
return geometry.contentOffset.y
} action: { oldValue, newValue in
print("old:", oldValue, "new", newValue)
}
}
}
간단한 코드를 입력하고
보면
처음 로드시 위치가 0으로 시작하고
뷰가 그려진이후에 safe area크기 때문에
자동으로 위에 공백이 들어가있어서 offset이 -62부터 시작되는걸 볼 수 있어요
스크롤하면 로그가 쭈우우욱 찍히는걸 볼 수 있어요
무시하고싶으면
.ignoresSafeArea()
를 사용하면됩니다!
스크롤하면 scrollGeometry값이 변경되서
정의해준 클로저부분이 호출되고
action에 old, new값이 들어오는데
이때 action엔 for에 넣어준 값(contentOffset의 y값) 이 전달되는걸 볼 수 있어요
원하는 타입과 값을 알맞게 정의해주고 간편하게 사용할 수 있겠네요
scrollGeometry는 스크롤하는 동안 자주 변경됩니다.
변경될 때마다 앱의 많은 부분을 업데이트하는 것은 피해야 합니다.
이를 돕기 위해 이 수정자에 두 개의 클로저를 제공합니다
transform - ScrollGeometry의 값을 고유한 데이터 유형으로 변환합니다.
action - 생성한 데이터 유형을 제공하며 데이터 유형이 변경될 때마다 호출됩니다.
transform는 scrollGeometry변경시 호출
action은 transform에서 변환한 값이 변경시 호출
이므로 상황에맞게 고랄 쓰면될 것 같아요
주의사항으로
2개이상의 스크롤뷰가 있을때
사용을 주의해야한다고합니다
뷰 계층 구조 내에 여러 개의 스크롤 뷰가 있는 경우 첫 번째 뷰만 제공한 클로저를 호출하고
런타임 문제가 기록됩니다.
예를 들어, 다음 코드에서
세로 스크롤 뷰만 지오메트리 변경 시 제공된 클로저를 호출한다고 하네요