본문 바로가기
iOS/설명

[iOS] setContentOffset의 animation 시간 조절하기

by Sky Titan 2022. 7. 25.
728x90
 

Change the speed of setContentOffset:animated:?

Is there a way to change the speed of the animation when scrolling a UITableView using setContentOffset:animated:? I want to scroll it to the top, but slowly. When I try the following, it causes the

stackoverflow.com

일반적으로 scrollView의 setContentOffset의 animation은 이런식으로 호출한다.

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

하지만 이 animation 시간을 조절하고 싶은 경우 2가지 방법을 생각해볼 수 있다.

 

1. UIView.animate활용

            UIView.animate(withDuration: 5, delay: 0, options: [], animations: {
                self.collectionView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
            }, completion: nil)

 위와 같이 UIView.animate를 써서 animated 필드를 false로 두거나, 혹은 contentOffset 필드의 값을 직접 지정하면 animation duration을 조절할 수 있다.

 

 하지만 이 경우에는 scrollViewDidScroll(_:)메서드가 scroll상태에 따라서 연속적으로 호출되지 않고 contentOffSet의 값이 최종 상태로 변경되었을 때, 한 번만 호출이된다는 단점이 있다.

scrollViewDidScroll이 한번만 호출되어 다른 View와의 상호작용에 문제가 발생한다.

 

2. scrollView.setValue 메서드 사용

            self.collectionView.setValue(5.0, forKeyPath: "contentOffsetAnimationDuration")
            self.collectionView.setContentOffset(CGPoint(x: 0, y: 0), animated: true)

 1번 방법의 단점을 완벽히 커버하는 방법이다. scrollView의 key path중 "contentOffsetAnimationDuration"의 value를 지정해주면 collectionView자체의 animation 시간이 변경되어서, scroll상태에 따라서 scrollViewDidScroll이 연속적으로 제대로 호출된다.

 Objective-c에 의존적이라는 부분이 좀 걸리지만 현재로서는 가장 이상적인 방법이다.

 

 참고로 setContentOffset(_:animated:)의 기본 duration은 0.3초이다.

scrollViewDidScroll이 제대로 호출된다.

728x90

'iOS > 설명' 카테고리의 다른 글

[iOS] Framework vs Library  (0) 2022.08.01
[iOS] IBOutlet Collections  (0) 2022.08.01
[iOS] UIView LifeCycle 생명주기  (0) 2022.07.18
[iOS] Public Beta vs Developer Beta  (0) 2022.07.17
[iOS] NSAttributedString에 image넣기  (0) 2022.07.15

댓글