タブスワイプで画面を切り替えるメニューUI

![Banner.png](https://qiita-image-store.s3.amazonaws.com/0/57131/965517ea-6011-df55-a756-973f316c8a90.png "Banner.png")

スマートニュースやグノシーのようなニュースアプリでよく使われていて、最近ではInstagramやTwitter, Spotifyなど、たくさんのアプリで使われている印象のあるUIを簡単に実装できるライブラリを公開しました:tada::tada:

[yysskk/SwipeMenuViewController](https://github.com/yysskk/SwipeMenuViewController)

## デモ
SwipeMenuViewは２つのスタイルに対応していて、以下のデモのような見た目を実現できます。またUIのカスタムやタブバーの挙動はoptionsを指定することで対応できます。

| Segmented style | Flexible style |
|:-:|:-:|
|<img src="https://github.com/yysskk/Assets/raw/master/SwipeMenuViewController/demo_segmented.gif" width="300" />  |<img src="https://github.com/yysskk/Assets/raw/master/SwipeMenuViewController/demo_flexible.gif" width="300" />   |

## 導入方法
CocoapodsとCarthageに対応しています。

Cocoapodsを利用する場合は`Podfile`に以下を追記し`pod install`を叩いてください。

```Podfile
pod 'SwipeMenuViewController'
```

Carthageを利用する場合は`Cartfile`に以下を追記し`carthage update`を叩いて、Carthageの設定を行ってください。

```Cartfile
github "yysskk/SwipeMenuViewController"
```

## 使い方
SwipeMenuViewControllerでは`SwipeMenuView`と`SwipeMenuViewController`を利用できます。
### SwipeMenuView
1.) 利用方法はいろいろありますが、ここではStoryboardに設置したUIViewに`SwipeMenuView`を継承させて、`ViewController.swift`に関連づけてます。
![スクリーンショット 2017-08-27 12.52.32.png](https://qiita-image-store.s3.amazonaws.com/0/57131/b16bbc90-bf7e-c091-474e-6cb843393e3e.png "スクリーンショット 2017-08-27 12.52.32.png")

2) swipeMenuViewに`didSet`でoptionsのカスタム設定を書いていきます。

```ViewController.swift
@IBOutlet weak var swipeMenuView: SwipeMenuView! {
    didSet {
        swipeMenuView.delegate = self
        swipeMenuView.dataSource = self
        var options: SwipeMenuViewOptions = .init()
		// options customize
        swipeMenuView.reload(options: options)
    }
}
```

3) ViewControllerに`SwipeMenuViewDataSource`を設定してください。

```ViewController.swift
extension ViewController: SwipeMenuViewDataSource
    func numberOfPages(in swipeMenuView: SwipeMenuView) -> Int {
        return datas.count
    }

    func swipeMenuView(_ swipeMenuView: SwipeMenuView, titleForPageAt index: Int) -> String {
        return datas[index]
    }

    func swipeMenuView(_ swipeMenuView: SwipeMenuView, viewControllerForPageAt index: Int) -> UIViewController {
        let vc = ViewController() 
        return vc
    }
}
```

4) ViewControllerに`SwipeMenuViewDelegate`のオプショナルメソッドを適宜設定してください。

```ViewController.swift
extension ViewController: SwipeMenuViewDelegate {
    func swipeMenuView(_ swipeMenuView: SwipeMenuView, viewWillSetupAt currentIndex: Int) {
        // Codes
    }

    func swipeMenuView(_ swipeMenuView: SwipeMenuView, viewDidSetupAt currentIndex: Int) {
        // Codes
    }

    func swipeMenuView(_ swipeMenuView: SwipeMenuView, willChangeIndexFrom fromIndex: Int, to toIndex: Int) {
        // Codes
    }

    func swipeMenuView(_ swipeMenuView: SwipeMenuView, didChangeIndexFrom fromIndex: Int, to toIndex: Int) {
        // Codes
    }
}
```


### SwipeMenuViewController
1) SwipeMenuViewControllerを利用する場合はViewControllerファイルにSwipeMenuViewControllerを継承させることで設定できます。

```CustomViewController.swift
class CustomViewController: SwipeMenuViewController {

	override func viewDidLoad() {
		super.viewDidLoad()
		
		var options: SwipeMenuViewOptions = .init()
		// options customize
       swipeMenuView.reloadData(options: options)

	}
}	
```

2) 適宜、`SwipeMenuViewDataSource`、`SwipeMenuViewDelegate`をオーバーライドさせてください。

```CustomViewController.swift
extension CustomViewController {
    // MARK: - SwipeMenuViewDelegate
    override func swipeMenuView(_ swipeMenuView: SwipeMenuView, viewWillSetupAt currentIndex: Int) {
        // Codes
    }

    override func swipeMenuView(_ swipeMenuView: SwipeMenuView, viewDidSetupAt currentIndex: Int) {
        // Codes
    }

    override func swipeMenuView(_ swipeMenuView: SwipeMenuView, willChangeIndexFrom fromIndex: Int, to toIndex: Int) {
        // Codes
    }

    override func swipeMenuView(_ swipeMenuView: SwipeMenuView, didChangeIndexFrom fromIndex: Int, to toIndex: Int) {
        // Codes
    }

    // MARK - SwipeMenuViewDataSource
    open override func numberOfPages(in swipeMenuView: SwipeMenuView) -> Int {
        return array.count
    }

    override func swipeMenuView(_ swipeMenuView: SwipeMenuView, titleForPageAt index: Int) -> String {
        return array[index]
    }

    override func swipeMenuView(_ swipeMenuView: SwipeMenuView, viewControllerForPageAt index: Int) -> UIViewController {
        let vc = ContentViewController()
        return vc
    }
}
```

## 最後
以上でSwipeMenuViewControllerの利用方法を説明しました。わかりにくいところありましたら、コメントやTwitterなどからお願いします！
これからOSS活動もしっかりやっていこうという気持ちでライブラリ化しました :muscle:
もっとこうした方がいいなどありましたら、どしどしPRお待ちしております :bow: