Objective-C
Xcode
iOS
CocoaPods
Swift
NewsPicksDay 13

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

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

欠かせないシリーズ

IBAnimatable

IBAnimatable.gif
これだけでこのレベルのアニメーションを作れるのかと驚いた。。
でも重宝するのはStoryboardやXib上でViewやButtonの角丸だったりを簡単に作れるところでした。
個人開発するアプリでは必ず初めに入れるライブラリのひとつです。

PINRemoteImage

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

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

diagram.png

みんな大好き、いまや通信で不可欠になっているAlamofireのラッパーライブラリです。
API通信周りの処理は全てお任せできます。また、公式にRxSwiftも採用しているところも○
swift4以上であればデコーダもCodableが優秀すぎるので、Moya + Codable + RxSwiftのAPI通信が自分は最良の選択な気がします。
Swift4 + Moya + RxSwift + Codableで作るAPIクライアント
ちなみにquicktypeというサイトを使用すればAPIの戻り値をコピペするだけでCodableのModelを一発で作ってくれてめちゃくちゃおすすめです。
スクリーンショット 2018-12-12 12.40.18.png

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

アプリ作成で絶対に遭遇するキーボードと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

しゃれおつなアニメーションtabbar
animatedTabBar.gif

Parchment

キュレーション系でよく見る上のPagingのメニューを簡単に実装できます
68747470733a2f2f73332d75732d776573742d312e616d617a6f6e6177732e636f6d2f70617263686d656e742d73776966742f70617263686d656e742d64656c65676174652e676966.gif
画像も載せられたり
68747470733a2f2f73332d75732d776573742d312e616d617a6f6e6177732e636f6d2f70617263686d656e742d73776966742f70617263686d656e742d756e73706c6173682e676966.gif

ColorMatchTabs

最近流行りのおしゃれな上タブ
preview.gif

image系

ImageSlideshow

Twitterライクな画像拡大表示できるライブラリ
68747470733a2f2f647a776f6e73656d72697368372e636c6f756466726f6e742e6e65742f6974656d732f325230363238336e3034305633503370306934322f657a6769662e636f6d2d6f7074696d697a652e676966.gif

TOCropViewController

画像の切り抜きライブラリ
screenshot.jpg

FacebookImagePicker

FaceBookからその人のアルバムを引っ張ってこれます
preview.png

FSPagerView

画像のスライドショーを簡単に実装できます。
拡張性も高いのが○
9003d880-ed65-11e6-882e-4587c97c8878.gif

マテリアルデザイン系

Material

material designをiOSで簡単に実装できます
687474703a2f2f7777772e636f736d69636d696e642e636f6d2f6d6174657269616c2f77686974652f627574746f6e2e676966.gif

Alert系

CDAlertView

アイコン付きAlertView
4bc1516e-a8e8-11e6-8e8b-c1a088f5daa0.png

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

使ってみたい、loadingも入れられるおしゃれボタン
68747470733a2f2f63646e2e6472696262626c652e636f6d2f75736572732f36323331392f73637265656e73686f74732f313934353539332f73686f742e676966.gif

カレンダー系

FSCalendar

数多くあるカレンダーライブラリの中でも一番拡張性が高く、使いやすかった印象
22354a0e-a342-11e6-8ae6-0614ea7f35ae.gif

Label系

ActiveLabel.swift

UIlabelに簡単にURL、ハッシュタグ、メンションを埋め込める
demo.gif

LTMorphingLabel

おしゃれなアニメーションつきUILabel
96bf5de6-059d-11e4-9826-a6f82025d1af.gif

menu系

circle-menu

アニメーションに気合い入りまくりの円形のメニュー
circle-menu.gif

SideMenu

拡張性の高いサイドメニュー
SlideOut.gif

GuillotineMenu

上から降ってくるUIのメニュー
example.gif

CHIPageControl

PageControl系

ワンランク上のPageControl
demo (1).gif

TextField系

TextFieldEffects

9種類から選べるカスタムTextField
UXを考えるとplaceHolderは入力始めても表示されていたほうが○
Hoshi.gif

チュートリアル系

Gecco

よく見るチュートリアル
2d1cb602-c038-11e5-8095-a2a0d77f99db.gif

paper-onboarding

おしゃれWalkthrough
paper-onboarding.gif

validation系

Validator

文字数制限やメールアドレスなどにvalidationを簡単にかけることができます。
また、自分でvalidationを追加することもできます。
validator-example.mov.gif

permission系

Permission

面倒なカメラや位置情報などのpermissionを簡単に管理することができます.

Firebase系

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

URLSchemeやpushからの起動などを楽にハンドリングでき、重宝しました。

最後に

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