관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] UIScrollView 스크롤 구분 방법 (setContentOffset과 사용자가 스크롤한 상태 구분) 본문

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에서 확인하는것

 

(완성)

* 전체 코드:  https://github.com/JK0369/ExScrollViewScrollByUser

Comments