2018年これだけは知っておきたいiOSライブラリ31選

いらっしゃいませ！
[NewsPicks Advent Calendar 2018](https://qiita.com/advent-calendar/2018/newspicks)の13日目を担当する齋藤です！
普段はNewsPicksでiOSエンジニアをやりながら個人でもアプリ開発をしています。
今年は寝る間も惜しんでひたすらiOSを書いていて、6つくらいのアプリに関わりました。
その中で自分が欠かすことのできないライブラリ、使ってみたいライブラリをまとめてみます！

# 欠かせないシリーズ

## [IBAnimatable](https://github.com/IBAnimatable/IBAnimatable)
![IBAnimatable.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/a977cf06-eb09-eda4-bfa2-02a3a7e7a4db.gif)
これだけでこのレベルのアニメーションを作れるのかと驚いた。。
でも重宝するのはStoryboardやXib上でViewやButtonの角丸だったりを簡単に作れるところでした。
個人開発するアプリでは必ず初めに入れるライブラリのひとつです。

## [PINRemoteImage](https://github.com/pinterest/PINRemoteImage)

[SDWebImage](https://github.com/SDWebImage/SDWebImage)の時代は終わったのか、、、と感じるPinterest製の画像キャッシュライブラリ。
SDWebImageと比べ圧倒的にメモリ使用量が少ないそう。画像キャッシュ系のライブラリはたくさんありますが機能としては割とみな同じようなものなので、メモリの使用量は選ぶ基準の１つとして大切です。
[SDWebImage と PINRemoteImage の速さを比較してみた](https://qiita.com/mironal/items/aab090a73bf6f14f0e50)

## [RxSwift](https://github.com/ReactiveX/RxSwift)

いまやiOS開発のデファクトになりつつあるRxSwift。
本来のRx的な非同期処理はもちろんですが、RxSwiftの良さは独自に提供されているRxCocoa。UIKitの色々なクラスのExtensionを定義してくれています。
例えば以外と面倒な文字数制限があり、かつ、あと何文字入力可能か表示されるtextFieldを作りたかったら

```ViewController.swift
        textField.rx.text.subscribe(
            onNext: { [weak self] text in
                if let txt = text {
                    guard let strongSelf = self else {
                        return
                    }
                    if txt.count > strongSelf.maxLength {
                        let substr = String(txt.prefix(10))
                        strongSelf.textField.text = substr
                    } else {
                        strongSelf.textCountLabel.text = "あと\(strongSelf.maxLength - (txt.count))文字"
                    }
                }
        }).disposed(by: disposeBag)
```

こんな感じで書けたりします。（もっと良い書き方あったらぜひ教えて下さい。。！）

## [Moya](https://github.com/Moya/Moya)

![diagram.png](https://qiita-image-store.s3.amazonaws.com/0/97817/d45ac8f3-3e29-030b-b7a5-4cfd0b1cdee8.png)


みんな大好き、いまや通信で不可欠になっている[Alamofire](https://github.com/Alamofire/Alamofire)のラッパーライブラリです。
API通信周りの処理は全てお任せできます。また、公式にRxSwiftも採用しているところも○
swift4以上であればデコーダもCodableが優秀すぎるので、Moya + Codable + RxSwiftのAPI通信が自分は最良の選択な気がします。
[Swift4 + Moya + RxSwift + Codableで作るAPIクライアント](https://qiita.com/kouheiszk/items/46e9a233d9bb227c3b1d)
ちなみに[quicktype](https://app.quicktype.io/)というサイトを使用すればAPIの戻り値をコピペするだけでCodableのModelを一発で作ってくれてめちゃくちゃおすすめです。
<img width="1124" alt="スクリーンショット 2018-12-12 12.40.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/97817/bfe1f423-e0ac-2e31-4e87-262c9c948380.png">

## [SwiftDate](https://github.com/malcommac/SwiftDate)

自分は大嫌いですがアプリを作成する上で切っても切れないDate関連。
SwiftDateを使用すれば簡単に記述できます。

```view.swift
// Math operations support time units
let _ = ("2010-05-20 15:30:00".toDate() + 3.months - 2.days)
let _ = Date() + 3.hours
let _ = date1 + [.year:1, .month:2, .hour:5]
let _ = date1 + date2
// extract single time unit components from date manipulation
let over1Year = (date3 - date2).year > 1
```

## [IQKeyboardManager](https://github.com/hackiftekhar/IQKeyboardManager)

アプリ作成で絶対に遭遇するキーボードとTextViewやTextFieldの入力欄がかぶる問題。
AppDelegateに以下記述するだけで一切気にする必要なくなります。

```AppDelegate.swift
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

      IQKeyboardManager.shared.enable = true

      return true
    }
}
```

# UI系

# タブ系

## [animated-tab-bar](https://github.com/Ramotion/animated-tab-bar)
しゃれおつなアニメーションtabbar
![animatedTabBar.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/bb7a8ba2-fa59-822b-5e2f-600ec8f2ef06.gif)

## [Parchment](https://github.com/rechsteiner/Parchment)

キュレーション系でよく見る上のPagingのメニューを簡単に実装できます
![68747470733a2f2f73332d75732d776573742d312e616d617a6f6e6177732e636f6d2f70617263686d656e742d73776966742f70617263686d656e742d64656c65676174652e676966.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/e70b5dc1-24dc-ab11-d013-d06df96f7fed.gif)
画像も載せられたり
![68747470733a2f2f73332d75732d776573742d312e616d617a6f6e6177732e636f6d2f70617263686d656e742d73776966742f70617263686d656e742d756e73706c6173682e676966.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/5bcddb22-f7e0-2263-3709-c7e14e340312.gif)

## [ColorMatchTabs](https://github.com/Yalantis/ColorMatchTabs)

最近流行りのおしゃれな上タブ
![preview.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/7cee6983-318c-fdcc-cf57-9af9577b60e2.gif)

# image系

## [ImageSlideshow](https://github.com/zvonicek/ImageSlideshow)
Twitterライクな画像拡大表示できるライブラリ
![68747470733a2f2f647a776f6e73656d72697368372e636c6f756466726f6e742e6e65742f6974656d732f325230363238336e3034305633503370306934322f657a6769662e636f6d2d6f7074696d697a652e676966.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/12f1bca6-a274-902d-7e42-3543e1b910ed.gif)

## [TOCropViewController](https://github.com/TimOliver/TOCropViewController)

画像の切り抜きライブラリ
![screenshot.jpg](https://qiita-image-store.s3.amazonaws.com/0/97817/488046f1-1e0c-897a-b496-a1f293c94778.jpeg)

## [FacebookImagePicker](https://github.com/floriangbh/FacebookImagePicker)
FaceBookからその人のアルバムを引っ張ってこれます
![preview.png](https://qiita-image-store.s3.amazonaws.com/0/97817/77cfdc37-07fc-32d1-55e1-c7d03a0d8ce2.png)

## [FSPagerView](https://github.com/WenchaoD/FSPagerView)
画像のスライドショーを簡単に実装できます。
拡張性も高いのが○
![9003d880-ed65-11e6-882e-4587c97c8878.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/fb72d65c-c5cb-4e14-5b05-a24421255223.gif)


# マテリアルデザイン系

## [Material](https://github.com/CosmicMind/Material)

material designをiOSで簡単に実装できます
![687474703a2f2f7777772e636f736d69636d696e642e636f6d2f6d6174657269616c2f77686974652f627574746f6e2e676966.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/63c11f31-4f7c-8c0b-3882-90ad7b4f88ce.gif)

# Alert系

## [CDAlertView](https://github.com/candostdagdeviren/CDAlertView)

アイコン付きAlertView
<img width="1299" alt="4bc1516e-a8e8-11e6-8e8b-c1a088f5daa0.png" src="https://qiita-image-store.s3.amazonaws.com/0/97817/5d30d1c6-76b6-c54f-cc89-6d20b950bbba.png">

## [Alertift](https://github.com/sgr-ksmt/Alertift)

標準のAlert、ActionSheetのラッパーライブラリ。
普通に書くと長くなってしまいますがAlertift使用すればこれだけで書けます。

```view.swift
Alertift.alert(title: "hoge",
               message: "hugo")
    .buttonTextColor(.red)
    .action(.default("ok")) { _, _, _ in
        print("ok tap")
    }
    .action(.cancel("キャンセル"))
    .show()
```

# ボタン系

## [TransitionButton](https://github.com/AladinWay/TransitionButton)
使ってみたい、loadingも入れられるおしゃれボタン
![68747470733a2f2f63646e2e6472696262626c652e636f6d2f75736572732f36323331392f73637265656e73686f74732f313934353539332f73686f742e676966.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/ea5cf8ae-afc9-f763-60f4-7f8caeb23f9c.gif)

# カレンダー系

## [FSCalendar](https://github.com/WenchaoD/FSCalendar)

数多くあるカレンダーライブラリの中でも一番拡張性が高く、使いやすかった印象
![22354a0e-a342-11e6-8ae6-0614ea7f35ae.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/9dba71f9-ff36-ccbf-6014-c3bd11942efd.gif)

# Label系

## [ActiveLabel.swift](https://github.com/optonaut/ActiveLabel.swift)

UIlabelに簡単にURL、ハッシュタグ、メンションを埋め込める
![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/2a4efc01-72fd-ebde-3d68-683463c8bab1.gif)

## [LTMorphingLabel](https://github.com/lexrus/LTMorphingLabel)

おしゃれなアニメーションつきUILabel
![96bf5de6-059d-11e4-9826-a6f82025d1af.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/f9243186-c703-e009-3c77-d85e814a2bae.gif)

# menu系

## [circle-menu](https://github.com/Ramotion/circle-menu)

アニメーションに気合い入りまくりの円形のメニュー
![circle-menu.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/6db7d8ce-df86-8bd1-3861-da4cade454a2.gif)

## [SideMenu](https://github.com/jonkykong/SideMenu)

拡張性の高いサイドメニュー
![SlideOut.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/65fc61b7-0ced-b2c4-a41e-933f09192e70.gif)

## [GuillotineMenu](https://github.com/Yalantis/GuillotineMenu)

上から降ってくるUIのメニュー
![example.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/ba0ef03f-4b4d-8bf0-5591-e8760851b1e9.gif)

# PageControl系

## [CHIPageControl](https://github.com/ChiliLabs/CHIPageControl)

ワンランク上のPageControl
![demo (1).gif](https://qiita-image-store.s3.amazonaws.com/0/97817/6f2785fc-ba7d-0960-84e4-d4f983c098c8.gif)

# TextField系

## [TextFieldEffects](https://github.com/raulriera/TextFieldEffects)

9種類から選べるカスタムTextField
UXを考えるとplaceHolderは入力始めても表示されていたほうが○
![Hoshi.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/68f0d56d-1de6-2d1b-d893-487ee6dccc94.gif)

# チュートリアル系

## [Gecco](https://github.com/yukiasai/Gecco)

よく見るチュートリアル
![2d1cb602-c038-11e5-8095-a2a0d77f99db.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/09229a5f-7d42-500a-fbb1-91afcf75642a.gif)

## [paper-onboarding](https://github.com/Ramotion/paper-onboarding)

おしゃれWalkthrough
![paper-onboarding.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/63ce28d4-034f-92af-403d-3682d41c8f01.gif)

# validation系

## [Validator](https://github.com/adamwaite/Validator)
文字数制限やメールアドレスなどにvalidationを簡単にかけることができます。
また、自分でvalidationを追加することもできます。
![validator-example.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/97817/12415a18-182f-75dc-8289-94d3630cd18f.gif)

# permission系

## [Permission](https://github.com/delba/Permission)
面倒なカメラや位置情報などのpermissionを簡単に管理することができます.

# Firebase系

## [Pring](https://github.com/1amageek/Pring)

最近流行りの非同期通信が得意のFirebase。ただ、デフォルトだと少し面倒なことが多いです。
Pringを使用すれば

```User.swift
class User: Object {
    dynamic var name: String?
    dynamic var nickName: String?
}
```

このようにモデルを定義して

```view.swift
let user: User = User(id: "ID")
user.save()
```

これだけで保存やupdateなどもできます。
また、TableViewやCollectionViewなどにdataSourceをセットしてあげれば、非同期で更新された値がviewに即座に反映されます。

# その他

## [Compass](https://github.com/hyperoslo/Compass)
URLSchemeやpushからの起動などを楽にハンドリングでき、重宝しました。

# 最後に

ライブラリは短い工数で実装できるようになる反面、カスタマイズしづらかったり、技術力が不足している段階でライブラリに頼るのもよくありません。ただ、上手に使用すれば間違えなく、自分の助けになります。使うべきかそうでないかをうまく見極めて、快適なライブラリ生活を送りましょう！！
明日は@satou30による「[Pick と Like で振り返る 2018年 NewsPicks で盛り上がったニュース](https://newspicks.com/news/3529489/body/)」です！ぜひご覧下さい〜^o^