가볍게 알아보는 PageViewController

Duna·2021년 7월 22일
1
post-thumbnail

오늘은 사용해보고 싶었던 pageViewcontroller를 데려왔습니다

안드로이드는 ViewPager가 있는데, 왜 iOS는 뭐가 없을까.

항상 ViewPager같은 걸 만들때마다 고민이었는데.

이미 있더군요, WWDC19에 등장한 PageViewController였습니다.

그래서 슬슬 친해보려고 PageViewController를 도전해봤습니다.


PageViewController와의 첫만남
충격적이었습니다. 아직도 뭐가 뭔지 구분이 잘 안되더라구요.

일단 pageViewController가 tableView, CollectionView처럼 DataSource, Delegate설정을 해줘야지 쇽샥 쇽샥 잘 움직인다는 것에서 1차 충격을 받았고 그 안에다가 BeforeVC, AfterVC에 대한 return값을 안주면 요상하게 움직인다는 것에 2차 충격을 받았습니다..🤦‍♀️

previousView와 nextView에 대한 코드를 짜줘야 하더라구요..

extension StoryPageVC: UIPageViewControllerDataSource {
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        guard let index = viewsList.firstIndex(of: viewController) else { return nil }
        let previousIndex = index - 1
        if previousIndex < 0 { return nil }
        return viewsList[previousIndex]
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        guard let index = viewsList.firstIndex(of: viewController) else { return nil }
        let nextIndex = index + 1
        if nextIndex == viewsList.count { return nil }
        return viewsList[nextIndex]
    }
}

PageViewController를 reload시키는 함수가 있을 줄 알았지만..

tableView처럼 따로 reload시켜주는 무언가는 없어서 마구 찾다보니
그냥 막 쓰고 있던 밑에 코드 속 친구가 reload역할을 하더라구요? 신기했습니다.

물론 아시겠지만 매번 화면이 뜰 때마다 reload시켜주고 싶으시다면 viewWillAppear에 넣어주시면 됩니다.

현재 ViewControllers와 direction를 정해주는 코드인데 그래서 그런지 Reload일도 합니다.

self.setViewControllers([viewsList[index]], direction: .forward, animated: true, completion: nil)

현재 위치에 해당하는 pageViewController의 index를 써야봐겠다! 라고 생각했는데
index를 호락호락하게 안주더라구요..
stackOverFlow를 통해서 다양한 코드를 받아왔는데 다 안먹는거예요..

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool)
{
   if (!completed)
  {
    return
  }
  self.pageControl.currentPageIndex = pageViewController.viewControllers!.first!.view.tag //Page Index
}

이런 코드가 안먹었습니다..
그래서 print했더니 다 0으로 index가 들어갑니다..
viewController들 중에서 first에 있는 view의 tag를 가져와서 계속 0를 return한게 아닐까 싶기도 해요..🥲

그래서 변수를 하나 만들어줬습니다.

var currentIndex: Int {
        guard let vc = viewControllers?.first else { return 0 }
        return viewsList.firstIndex(of: vc) ?? 0
}

이 친구는 현재 있는 viewController의 index를 쇽샥 반환해줍니다. 최고최고. 👍


쇽샥쇽샥 움직이는 모습 보기

profile
더 멋진 iOS 개발자를 향해

0개의 댓글