[iOS] PageViewController 사용하기
PageViewController 사용해보기..!!
페이지 넘기듯이 내가 원하는 뷰 컨트롤러를 제어할 수 있다.
extension PageVC: UIPageViewControllerDelegate, UIPageViewControllerDataSource {
// 페이지 이동할때마다 호출
func pageViewController(_ pageViewController: UIPageViewController,didFinishAnimating finished: Bool,previousViewControllers: [UIViewController],transitionCompleted completed: Bool){
guard completed else { return }
currentIndex = pageViewController.viewControllers!.first!.view.tag
}
// 페이지 이동 전 호출
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard let index = pageList.firstIndex(of: viewController),
index - 1 >= 0
else { return nil }
return pageList[index - 1]
}
// 페이지 이동 후 호출
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard let index = pageList.firstIndex(of: viewController),
index + 1 != pageList.count
else { return nil }
return pageList[index + 1]
}
}
func nextPage() {
if currentIndex < pageList.count - 1 {
currentIndex += 1
}
pageContainer.setViewControllers([pageList[currentIndex]], direction: .forward, animated: true, completion: nil)
}
코드는 대략 이렇게 작성했다!!
페이지를 넘길때 위와 같은 함수가 호출되어 정해둔 인덱스에 맞게 뷰컨트롤러를 표시하고 currentIndex를 통해 제어한다.
구현방법은 여기저기 잘 나와있어서 어렵진 않았는데 아래 함수들이 언제 호출되는지 명확하게 이해가 안되었다.
func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController])
func pageViewController(_ pageViewController: UIPageViewController,didFinishAnimating finished: Bool,previousViewControllers: [UIViewController],transitionCompleted completed: Bool)
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
1. willTransitionTo
애니메이션이 시작할 때 호출된다.
2. didFinishAnimating
애니메이션이 종료될 때 호출된다.
이 두 함수들은 페이지를 좌우로 스크롤할 때 호출되는 함수이다. 순서는 willTransitionTo -> didFinishAnimating으로 호출된다.
이 두 함수들은 페이지를 한번 스크롤할때 각각 한번씩 호출된다. 그래서 나는 이 특징을 이용해 didFinishAnimating에서 화면 이동이 끝났을 때 currentIndex를 계산해주었다.
3. viewControllerBefore
페이지를 왼쪽으로(이전)스크롤할때 호출된다.
4. viewControllerAfter
페이지를 오른쪽으로(이후)스크롤할때 호출된다.
이 두 함수들은 페이지를 어느 방향으로 이동했냐에 따라 호출된다. (두 함수 중 하나만 호출)
다른 예제에서 viewControllerBefore, viewControllerAfter에서 클래스내 프로퍼티로 선언한 인덱스 계산을 안해주는것 같다.
직접 테스트 해보니까 willTransitionTo와 didFinishAnimating는 페이지 이동시 무조건 딱 한번씩 호출되는걸 확인했지만 viewControllerBefore와 viewControllerAfter는 호출될 경우도 있고 안될때도 있고... 순서도 조금 일정하지 않고 어떤 경우에는 2번 호출되기도 해서 그렇게 안정적이진 않은것 같다. (아니면 내가 모르는 다른 기능이 있는것 같다.)
여러가지 뷰 컨트롤러를 페이지로 처리하고 싶을 때 PageViewController를 사용하면 용이하다고 생각한다!