카테고리 없음

[SwiftUI] ScrollView onScrollGeometryChange iOS18+

냄수 2024. 11. 17. 20:04
반응형

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개이상의 스크롤뷰가 있을때 

사용을 주의해야한다고합니다

 

뷰 계층 구조 내에 여러 개의 스크롤 뷰가 있는 경우 첫 번째 뷰만 제공한 클로저를 호출하고 

런타임 문제가 기록됩니다. 

 

예를 들어, 다음 코드에서

세로 스크롤 뷰만 지오메트리 변경 시 제공된 클로저를 호출한다고 하네요

 

 

 

 

 

반응형