化粧品アプリLIPSでも使われてるPageMenuを導入方法[Swift3][Swift4でも]


LIPSでも使われているPageMenu

PageMenuをCocoapodsでインストールするとエラーを吐く

Swift3以前のものがCocoapodsでは使用されています。そのためGithubからコピペする必要があります。PageMenuのGithubファイルはこちら

Swift Versionを3.3に落とす

Swift4には未だ対応してないため4のまま修正するより3.3にバージョンを落とす方が楽です。

PageMenuViewController.swift
class PageMenuViewController: UIViewController {

    var pageMenu: CAPSPageMenu?


    override func viewDidLoad() {
        super.viewDidLoad()

        //ストーリーボードのFavListTableViewControllerを取得する必要がある
        let vc1 = storyboard?.instantiateViewController(withIdentifier: "FavListTableViewController") as! FavListTableViewController
        let vc2 = storyboard?.instantiateViewController(withIdentifier: "FavListTableViewController") as! FavListTableViewController
        let vc3 = storyboard?.instantiateViewController(withIdentifier: "FavListTableViewController") as! FavListTableViewController
        let vc4 = storyboard?.instantiateViewController(withIdentifier: "FavListTableViewController") as! FavListTableViewController
        let vc5 = storyboard?.instantiateViewController(withIdentifier: "FavListTableViewController") as! FavListTableViewController

        //TableViewはViewControllerのViewのサブクラスなのでViewが生成されてからじゃないと作れない
        _ = vc1.view
        _ = vc2.view
        _ = vc3.view
        _ = vc4.view
        _ = vc5.view


        vc1.title = "リスト1"
        vc2.title = "リスト2"
        vc3.title = "リスト3"
        vc4.title = "リスト4"
        vc5.title = "リスト5"

        vc1.listNum = 1
        vc2.listNum = 2
        vc3.listNum = 3
        vc4.listNum = 4
        vc5.listNum = 5

        let parameters: [CAPSPageMenuOption] = [
            .menuItemSeparatorWidth(4.0),
            .useMenuLikeSegmentedControl(true),
            .menuItemSeparatorPercentageHeight(0.0)
        ]
        pageMenu = CAPSPageMenu(viewControllers: [vc1, vc2, vc3, vc4, vc5], frame: view.bounds, pageMenuOptions: parameters)
        view.addSubview(pageMenu!.view)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

//     PageMenuがNavigationBarと被らないように
    override func viewDidLayoutSubviews() {
        let naviHeight = UIApplication.shared.statusBarFrame.size.height + self.navigationController!.navigationBar.frame.height
        pageMenu!.view.frame = CGRect(x: 0.0, y: naviHeight, width: self.view.frame.width, height: self.view.frame.height - naviHeight)
        print(#function)

//        let tabHeight = self.tabBarController?.tabBar.frame.size.height

    }
}

僕の場合、ストーリーボードにUIViewControllerであるFavListTableViewControllerを配置し、それをStoryboard IDで取得しています。ViewControllerの規則としてUIViewControllerに置かれるUIKit部品は、UIViewが呼ばれてからでないと呼ばれません。僕のケースですとUITableViewを置いていました。

PageMenuのGithubドキュメントにあるようにタイトルやparametersを指定し、addSubViewしてあげます。