怠慢プログラマーの備忘録

怠慢でナマケモノなプログラマーの備忘録です。

Swift4対応 スライドメニューの実装方法

Swift4になってSlideMenuControllerSwiftを入れてみたらエラーのお祭りだったので、swift4対応方法について。

cocoapodでSlideMenuControllerSwiftをインストール

swift4というブランチがあるのでそれを指定。

Podfile.rb

frameworks
  use_frameworks!

  # Pods for k-curation-ios
    pod 'Firebase/Database’
    pod ‘RxCocoa’
    pod ‘RxSwift’
    pod 'SlideMenuControllerSwift', :git => 'https://github.com/dekatotoro/SlideMenuControllerSwift', :branch => 'swift4'

ViewController追加

以下のViewControllerを追加します

  • MainViewController
  • SlideViewController
  • LeftMenuViewController

StoryBoard追加

f:id:ka0in:20171028032235p:plain

StoryBoardId設定

f:id:ka0in:20171028032738p:plain

f:id:ka0in:20171028032753p:plain

ViewControllerの中身

SlideViewController

import UIKit
import SlideMenuControllerSwift
 
class SlideViewController: SlideMenuController {
 
    override func awakeFromNib() {
        let mainVC = storyboard?.instantiateViewController(withIdentifier: "Main")
        let leftVC = storyboard?.instantiateViewController(withIdentifier: "Left")
 
        //NavigationBarを生成
        let navigationController = UINavigationController(rootViewController: mainVC!)
        navigationController.navigationBar.barTintColor = UIColor.colorWithHexString("0033FF")
        navigationController.navigationBar.tintColor = UIColor.white
        navigationController.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName : UIColor.white]
 
        //ライブラリ特有のプロパティにセット
        mainViewController = navigationController
        leftViewController = leftVC
        SlideMenuOptions.leftViewWidth = 200
        super.awakeFromNib()
    }
 
    override func viewDidLoad() {
        super.viewDidLoad()
 
        // Do any additional setup after loading the view.
    }
}

LeftMenuViewController

import UIKit
 
class LeftMenuViewController: UIViewController {
 
    override func viewDidLoad() {
        super.viewDidLoad()
 
        // Do any additional setup after loading the view.
    }
}

MainListViewController

import SlideMenuControllerSwift  

class MainViewController: UIViewController {
  
  ...
  
   @objc private func didTapMenuIcon() {
        self.slideMenuController()?.openLeft()
    }

  ...

}

その他

メニューの開閉操作

(ボタンイベントなどで)メニューをOpen

self.slideMenuController()?.openLeft()

(ボタンイベントなどで)メニューをClose

self.slideMenuController()?.closeLeft()

settingプロパティ

SlideMenuOptions

leftViewWidth: CGFloat = 270.0

  • 左メニューの横幅

rightViewWidth: CGFloat = 270.0

  • 右メニューの横幅

leftBezelWidth: CGFloat? = 16.0

  • 画面スワイプ時に感知する左からの横幅

rightBezelWidth: CGFloat? = 16.0

  • 画面スワイプ時に感知する右からの横幅

rightPanFromBezel: Bool = true

  • falseにするとスワイプでメニューを開くことができなくなる

contentViewScale: CGFloat = 0.96

  • メニューを開いた時のmainVCの縮み率

opacityViewBackgroundColor: UIColor = UIColor.black

  • メニューを開いた時のmainVCにかかる色

contentViewOpacity: CGFloat = 0.5

  • メニューを開いた時のmainVCにかかる色のalpha値

contentViewDrag: Bool = false

  • メニューを開いた時にmainVCがメニューのwidth分ずれて表示されるかどうか

shadowOpacity: CGFloat = 0

  • 影の明るさ(0)

shadowRadius: CGFloat = 0

  • 影のぼかし具合(0)

shadowOffset: CGSize = CGSize.zero

  • 矩形からどれだけ影がずれているか

panFromBezel: Bool = true

  • 画面スワイプでメニューを出せるかどうか

animationDuration: CGFloat = 0.4

  • メニューを出す速度

hideStatusBar: Bool = true

  • ステータスバーを隠すかどうか

simultaneousGestureRecognizers: Bool = true

panGesturesEnabled: Bool = true

  • スワイプでのメニュー開閉動作が可能かどうか

tapGesturesEnabled: Bool = true

  • タップでのメニューを閉じる動作が可能かどうか

メニューの状態を監視するときはSlideMenuControllerDelegateを使う

  • func leftWillOpen ()
  • func leftDidOpen ()
  • func leftWillClose ()
  • func leftDidClose ()
  • func rightWillOpen ()
  • func rightDidOpen ()
  • func rightWillClose ()
  • func rightDidClose ()