iOS UIPageViewController


import UIKit

class NestVC: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
    
    let pageViewController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
/*
    let pageControl:UIPageControl = {
        let pc = UIPageControl()
        pc.currentPageIndicatorTintColor = .red
        pc.pageIndicatorTintColor = .blue
        pc.translatesAutoresizingMaskIntoConstraints = false
        return pc
    }()
    */
    var vcs = [UIViewController]()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        setPageViewController()
        //setPageControl()
    }
    
    func setPageViewController() {
        pageViewController.dataSource = self
        pageViewController.delegate = self
        
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc1 = storyboard.instantiateViewController(withIdentifier: "SB_NAV_MODE1") as! UINavigationController
        
        let vc2 = storyboard.instantiateViewController(withIdentifier: "SB_NAV_MODE2") as! UINavigationController
        
        pageViewController.setViewControllers([vc1], direction: .forward, animated: true, completion: nil)
        
        vcs.append(vc1)
        vcs.append(vc2)
        
        addChild(pageViewController)
        view.addSubview(pageViewController.view)
        pageViewController.didMove(toParent: self)
        
        
    }
    /*
    func setPageControl() {
        pageControl.numberOfPages = 2
        
        view.addSubview(pageControl)
        NSLayoutConstraint.activate([
            pageControl.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0),
            pageControl.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            pageControl.trailingAnchor.constraint(equalTo: view.trailingAnchor)
        ])
    }
    */
    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

    // MARK: - PageViewController
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        
        guard let index = vcs.firstIndex(of: viewController) else {
            return nil
        }
        
        let prevIndex = index - 1
        
        guard prevIndex >= 0 else {
            return nil // vcs.last
        }
        
        guard vcs.count > prevIndex else {
            return nil
        }
        
        return vcs[prevIndex]
        
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        
        guard let index = vcs.firstIndex(of: viewController) else {
            return nil
        }
        
        let nextIndex = index + 1
        
        guard nextIndex < vcs.count else {
            return nil // or vcs.first
        }
        
        return vcs[nextIndex]
    }
    
    func presentationCount(for pageViewController:UIPageViewController) -> Int {
        return vcs.count
    }
    
    func presentationIndex(for pageViewController: UIPageViewController) -> Int {
        guard let firstViewController = vcs.first, let firstViewControllerIndex = vcs.firstIndex(of: firstViewController) else {
            return 0
        }
        
        return firstViewControllerIndex
    }
    
    //  스와이프 제스쳐가 끝나면 호출되는 메서드입니다. 여기서 페이지 컨트롤의 인디케이터를 움직여줄꺼에요
    func pageViewController(_ pageViewController: UIPageViewController,
                            didFinishAnimating finished: Bool,
                            previousViewControllers: [UIViewController],
                            transitionCompleted completed: Bool
    ) {
        //  페이지 이동이 안됐으면 그냥 종료
        guard completed else { return }
        
        //  페이지 이동이 됐기 때문에 페이지 컨트롤의 인디케이터를 갱신해줍시다
        /*
        if let vc = pageViewController.viewControllers?.first {
            pageControl.currentPage = vc.view.tag
        }
 */
    }
}

,

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다