Swift

Swift:UIPageViewControllerで画面遷移しよう!


今回はUIPageViewControllerで画面遷移しましょう!

PageViewControllerとは?

PageViewControllerとはフリック?スワイプ?して画面遷移できるもので、
iosアプリでかなりよく見る便利なアレです。

まずはStoryBoardです。

f:id:jumprails3303:20161121151150p:plain
このように、一番左がPageViewController(is initial View Controllerに設定)
左から2、3、4番目がViewControllerです。(順番はどうでもよいです。)

次に三つのviewControllerにStoryBoard IDを設定しましょう!

f:id:jumprails3303:20161121151559p:plain

こんな感じです。
IDはそれぞれ

『FirstViewController』

『SecondViewController』

『ThirdViewController』


としましょう。

次に
それぞれのViewControllerに対応したファイルを作成しましょう!
ファイル名は
『FirstViewController』
『SecondViewController』
『ThirdViewController』

としてください。
そして、上の画像と同じように
custum classのclassに設定してください。

それとPageViewControllerのファイルも作成しましょう!
ファイル名は
『PageViewController』
にしましょう。
そして、下記のように編集しましょう。

import UIKit

class PageViewController: UIPageViewController, UIPageViewControllerDataSource {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.setViewControllers([getFirst()], direction: .reverse, animated: true, completion: nil)
        // 最初のviewControllerを設定している
        
        self.dataSource = self
    }
    
    func getFirst() -> FirstViewController {
        return storyboard!.instantiateViewController(withIdentifier: "FirstViewController") as! FirstViewController
        //StoryBoard上のFirstViewControllerをインスタンス化している
        //withIdentifierはStoryBoard上で設定したStoryBoard Id
    }
    
    func getSecond() -> SecondViewController {
        return storyboard!.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
    }
    
    func getThird() -> ThirdViewController {
        return storyboard!.instantiateViewController(withIdentifier: "ThirdViewController") as! ThirdViewController
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        // 左に進む動き(前に戻る)
        
        if viewController.isKind(of: ThirdViewController.self)// 現在のviewControllerがThirdViewControllerかどうか調べる
        {
            // 3 -> 2
            return getSecond()
            
        } else if viewController.isKind(of: SecondViewController.self) {// 現在のviewControllerがSecondViewControllerかどうか調べる
            // 2 -> 1
            return getFirst()
            
        } else {
            // 1 -> end of the road
            return nil
        }
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
        {
        // 右に進む(先に進む)
            
        if viewController.isKind(of: FirstViewController.self)// 現在のviewControllerがFirstViewControllerかどうか調べる
        {
            // 1 -> 2
            return getSecond()
            
        } else if viewController.isKind(of: SecondViewController.self) {// 現在のviewControllerがSecondViewCotrollerかどうか調べる
            // 2 -> 3
            return getThird()
            
        } else {
            // 3 -> end of the road
            return nil
        }
    }
}

これで完成です!!!

参考

qiita.com


ABOUT ME
ささお
3年目iOSエンジニア。 スタートアップで働いておりやす。 プログラミングスクールとエンジニアのキャリアを考えたい。 作ったアプリ - https://apps.apple.com/us/app/loverprofile/id1463563845?l=ja&ls=1