UI 컴포넌트 (swift)
[iOS - swift] UIScrollView 스크롤 구분 방법 (setContentOffset과 사용자가 스크롤한 상태 구분)
jake-kim
2023. 6. 23. 00:40
스크롤 구분 방법
- 스크롤을 정교하게 컨트롤하다보면 사용자가 드래그하여 스크롤이 시작되었는지, setContentOffset(_:animated:)로 스크롤을 지정했는지 구분이 필요
- ex) UIScrollView에서 스크롤 될 때마다 특정 처리를 하고싶은 경우 사용하는 didScroll 델리게이트에서 setContentOffset과 직접 드래그 했을때 구분하고 싶은 경우?
extension ViewController: UITableViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
print(scrollView.contentOffset)
label.text = "\(scrollView.contentOffset)"
}
}

- 사용자가 드래그한 것인지 코드(setContentOffset)으로 스크롤을 조절할 수 있는지 확인할 수 있는 방법?
- 전역 변수로 scrolledByUser라는 bool값을 선언
var scrolledByUser = false
- UIScrollViewDelegate에서 이 값을 제어
- scrollViewWillBeginDragging에서 user가 스크롤을 했다는 플래그를 true로 설정
- scrollViewDidEndDecelerating에서 user가 스크롤을 했다는 플래그를 false로 설정
extension ViewController: UITableViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let prefix = scrolledByUser ? "byUser, " : "byCode, "
print(scrolledByUser)
label.text = prefix + "\(scrollView.contentOffset)"
}
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
scrolledByUser = true
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
scrolledByUser = false
}
}
주의) scrollViewDidEndDragging가 아닌 scrollViewDidEndDecelerating에서 플래그값을 제어하는 이유는, scrollViewDidEndDragging 같은 경우 사용자가 손을 뗐을때 바로 호출되므로, 드래그로 스크롤을 시작하여 스크롤이 끝나기 까지 알기 위해서 scrollViewDidEndDecelerating에서 확인하는것
(완성)
