ios SideMenu ライブラリの使い方

アプリの左から開くサイドメニューを作りたくライブラリを探したらけっこう出てきた。こちらの使い方を調べたので簡単にまとめておく
github.com

今回やるながれはこんな感じ
1. メニュー化するViewControllerの作成
2. AppDelegateで1.で作成したViewControllerをメニューとしてセットアップ
3. メニューを開く
4. メニューを閉じて値を返す

cocoapodsまたはcarthageで他のライブラリとおなじように入れられるのでそれは省略

1. メニュー化するViewControllerの作成

今回はMenuViewControllerとかにする

MainViewController.swift

import UIKit
import SideMenu

class LeftMenuViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

	// 背景色は白にする
	view.backgroundColor = .white

	// メニューとするViewControllerはナビゲーションをもつので、見た目とか調整
	self.navigationController?.navigationBar.tintColor = .clear
	self.navigationController?.navigationBar.barStyle = UIBarStyle.black
	self.navigationController?.navigationBar.isTranslucent = true
	self.navigationController?.navigationBar.backgroundColor = .green
    }
}
2. AppDelegateで1.で作成したViewControllerをメニューとしてセットアップ

AppDelegate.swift

import UIKit
import SideMenu

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
	// アプリ起動時に表示するViewControllerを設定
	let viewController = ViewController()
	let navigationController = UINavigationController(rootViewController: viewController)
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.backgroundColor = UIColor.white
        window?.rootViewController = navigationController
        window?.makeKeyAndVisible()

        // さきほど作ったメニュー用のMenuViewControllerをSideMenuにセットする
        let menuViewController = MenuViewController()
        let menuNavigationController = SideMenuNavigationController(rootViewController: menuViewController)
        SideMenuManager.default.leftMenuNavigationController = menuNavigationController
        SideMenuManager.default.addPanGestureToPresent(toView: navigationController.navigationBar)
        SideMenuManager.default.addScreenEdgePanGesturesToPresent(toView: navigationController.view)

        // Readmeに書かれているオプションもここで指定できる
        leftMenuNavigationController.statusBarEndAlpha = 0
        leftMenuNavigationController.menuWidth = 300
        leftMenuNavigationController.enableSwipeToDismissGesture = false
        return true
    }

    ・・・
}
3. メニューを開く

ViewController.swift

import UIKit
import SideMenu

class ViewController: UIViewController {

   ・・・

   @objc func showMenu(_ sender: UITapGestureRecognizer){
     // ここでメニューが開く
     let menu = SideMenuManager.default.leftMenuNavigationController!
     present(menu, animated: true, completion: nil)
   }
}
4. メニューを閉じて値を返す

メニュー側の画面にメニューを閉じる処理と呼び出し元に値を返してやる処理を追加

class MenuViewController: UIViewController {

   ・・・

    @objc func onTap(_ sender: UITapGestureRecognizer){
        dismiss(animated: true, completion: nil)

        NotificationCenter.default.post(
          name: Notification.Name("SelectMenuNotification"),
          object: nil,
          userInfo: ["hoge":"fuga"] // 返したいデータをセットするよ
        )
    }

呼び出し側でメニューから値を受け取る

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // メニューからの通知を受け取れるようにするよ
        NotificationCenter.default.addObserver(
          self,
          selector: #selector(catchSelectMenuNotification(notification:)),
          name: Notification.Name("SelectMenuNotification"),
          object: nil
        )

        ・・・
    }

    @objc func catchSelectMenuNotification(notification: Notification) -> Void {
	// notification.userInfo にメニューからの返り値を取得できるよ
    }
}

SideMenuのライブラリは色々あるけど今回試したのはこんな感じでした。以上です