나의 플랫폼/iOS

[iOS] UIScrollView 이동

GsBOB 2017. 8. 16. 10:40

import Foundation


extension UIScrollView {

    

    // Scroll to a specific view so that it's top is at the top our scrollview

    func scrollToView(view:UIView) {

        if let origin = view.superview {

            // Get the Y position of your child view

            let childStartPoint = origin.convert(view.frame.origin, to: self)

            

            let bottomOffset = scrollBottomOffset()

            if (childStartPoint.y > bottomOffset.y) {

                setContentOffset(bottomOffset, animated: true)

            } else {

                setContentOffset(CGPoint(x: 0, y: childStartPoint.y), animated: true)

            }

        }

    }

    

    // Bonus: Scroll to top

    func scrollToTop() {

        let topOffset = CGPoint(x: 0, y: -contentInset.top)

        setContentOffset(topOffset, animated: true)

    }

    

    // Bonus: Scroll to bottom

    func scrollToBottom() {

        let bottomOffset = scrollBottomOffset()

        if(bottomOffset.y > 0) {

            setContentOffset(bottomOffset, animated: true)

        }

    }

    

    private func scrollBottomOffset() -> CGPoint {

        return CGPoint(x: 0, y: contentSize.height - bounds.size.height + contentInset.bottom)

    }

    

}


참고 : https://stackoverflow.com/a/39018651



위 소스를 참고 하시면 될 듯 합니다.


UIScrollView 내부에 존재하는 특정 View로 위치 하는 함수와 최상위, 최하위로 이동하는 함수가 구현 되어 있습니다.


특정 View 이동 시, Bottom 보다 혹시 더 많이 이동 될 경우 Bottom으로 고정 시키도록 예외 처리도 넣었습니다.



### 참고 사항

제가 테스트 해봤을 때는, setContentOffset에 animated 매개변수를 false로 할경우

이동이 되지 않는 버그가 있었습니다.

혹시, 이 원인을 아시거나 해결책을 아시는 분은 댓글 주시면 감사하겠습니다.