UIScrollView: [Apple] UIScrollView

J.Noma·2021년 11월 23일
0

iOS : View : UIKit

목록 보기
8/17
post-custom-banner

출처 : https://developer.apple.com/documentation/uikit/uiscrollview


Overview

✔️ 정의

UIScrollView는 TableView나 TextView같은 UIKit class들의 superclass입니다

scroll view는 content view 위에서 조정가능한 origin을 가진 view입니다
(origin은 visible view의 왼쪽 위 꼭지점을 말함. 즉, visible view를 조정가능하다)

✔️ 메커니즘

이것은 content를 frame에 clip합니다

scroll view는 손가락의 움직임을 추적하여 그에 따라 origin을 조정합니다

scroll view를 통해 content를 보여주는 view는
손가락에 의해 조정된 new origin에 따라
그에 대응되는 content의 부분을 그려줍니다
(new origin은 content view에서 offset으로 고정됩니다)

scroll view 자체가 보여주는 것은, vertical/horizontal scroll indicator 밖에 없습니다

✔️ 기타 특징

scroll view는 content view의 size를 알아야 합니다
그래야 scrolling을 언제 멈출지를 알게 됩니다

디폴트로, scrolling이 content의 bounds를 넘어서게 되면 고무처럼 튕겨저 나옵니다 (bounce back)

scroll view에서 보여질 content를 그리는 것을 관리하는 객체는
content의 subview들을 타일링하는 것이 필요합니다
view가 screen의 size를 초과하지 않도록 하기 위함입니다
유저가 scroll할 때, 이 객체는 (필요하다면) subview를 추가/제거합니다

✔️ 유저의 터치가 어떤 의도인지 알아야 합니다

scroll view는 scroll bar가 따로 없기 때문에
유저의 터치가 scroll하려는 의도인지,
subview의 content를 보려는 의도인지를 알 수 있어야 합니다

이 판단을 하기 위해, 이것은 touch-down 이벤트를 일시적으로 방해합니다
touch-down 시점에 timer를 걸고
이게 만료되기 전에 터치 손가락이 다른 움직임을 보이는지 확인합니다
(ex. 사진 App에서 사진을 누른 상태에서 2초동안 아무것도 안하면 해당 사진 설정 옵션이 뜸)

만약 터치 상태를 timer가 만료될 때까지 가만히 유지하면
scroll view에게 content에 터치 이벤트가 발생한 것으로 전달합니다

만약 그 전에 손가락을 드래그하면
scroll view는 터치 추적을 취소하고 scrolling을 수행합니다

관련 메서드로 touchesShouldBegin() / isPagingEnabled / touchesShouldCancel()이 있습니다

✔️내부 Content 확대/축소/이동

scroll view는 content를 확대/축소하고 상하좌우 이동시키는 것도 처리합니다

유저가 pinch-in/out 제스쳐를 취하면
scroll view는 offset과 content의 scale을 조정합니다

제스쳐가 끝나면 (필요 시) content view를 관리하는 객체가 subview들을 업데이트합니다
(제스쳐는 끝났어도 손가락은 여전히 눌려져 있을 수 있음을 주의하라)

제스쳐가 진행중일 때는 scroll view가 subview로 tracking call을 보내지 않습니다

확대/축소/이동에 delegation 활용
UIScrollView class는 UIScrollViewDelegate 프로토콜을 채택하는 delegate를 가질 수 있습니다

확대/축소/이동을 수행하기 위해,
delegate는 viewForZooming() / scrollViewDidEndZooming() 메서드를 구현해야 합니다

추가로, maximumZoomScaleminimumZoomScale이 달라야 합니다


Scroll 위치 기억하기

만약 당신이 view의 restorationIdentifier 프로퍼티에 값을 할당한다면
이것은 App 실행 간 scrolling 관련 정보를 보존하려고 시도합니다
(App을 나갔다가 다시 들어와도 scrolling 상태가 유지되도록)

구체적으로, zoomScale / contentInset / contentOffset 프로퍼티가 보존됩니다

복구 과정에서 scroll view는 이 프로퍼티들의 값을 복구하여
content view에서 이전과 같은 위치가 보이도록 합니다

profile
노션으로 이사갑니다 https://tungsten-run-778.notion.site/Study-Archive-98e51c3793684d428070695d5722d1fe
post-custom-banner

0개의 댓글