400
394

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

約2年のiOSアプリ開発で実際に使ったライブラリとそこから得られた知見

Last updated at Posted at 2016-04-14

会社で約2年ほどiOSアプリを新規で開発してきた中で実際に用いたライブラリや検討したもの、または参考にして独自に作ったものなどを紹介します。

##動画撮影・編集アプリ(開発言語: Objective-Cで用いたもの)
GPUImage
ド定番。カメラ処理やフィルターなど全般で活用。

KLCPopup
ポップアップのライブラリです。showTypeとdismissTypeを指定できるので自分好みなアニメーションを選択できます。

ReverseClip
動画の逆再生部分で用いています。

SDAVAssetExportSession
AVAssetExportSessionを使いやすくしたもの

iso-8601-date-formatter
NSDateFormatterのサブクラス。日時のフォーマットなどを扱う際に便利です。

SimpleKeychain
キーチェーンを扱うラッパーです。

##女性向け美容アプリ(開発言語: Objective-C)で用いたもの

SSZipArchive
アプリが通信容量を削減するためニュース記事をZip形式で受け取っており、それを解凍するためにこちらのライブラリを使いました。パスコード付きのものも対応しています。

MBProgressHUD
言わずもがなの有名ライブラリ。
HUDのタイプを指定できます。個人的にはDLなどの進捗を表す際に使うと便利だと思います。
その他の用途ならSVProgressHUDが個人的に好きです。MBProgressHUDはコードも割と書かなきゃいけないので。

SDWebImage
こちらも言わずもがなですね。
簡単に非同期で画像ダウンロードもできキャッシュも上手くやってくれるライブラリ。
画像ダウンロードが完了するまでに表示するplaceHolder画像が設定できたりします。

###以下参考にしたもの
NSDate-Extensions
アプリ内にアラームやカレンダーの機能があるので日付の計算や時間の計算を簡単にしたいという思いで、独自のNSDateのカテゴリを作るときに非常に参考になりました。

#define D_MINUTE	60
#define D_HOUR		3600
#define D_DAY		86400
#define D_WEEK		604800
#define D_YEAR		31556926

//例
+ (NSDate *) dateTomorrow;
+ (NSDate *) dateYesterday;
- (NSDate *) dateByAddingYears: (NSInteger) dYears;
- (NSDate *) dateBySubtractingYears: (NSInteger) dYears;

RDVCalendarView
カレンダーを作るときに参考にしました。こちらをそのまま使おうとするとページング対応してないので、月を変えるときにボタンでviewをリフレッシュするか、UISwipeGestureなどを使ってスワイプの際にCATransitionのアニメーションなどでそれらしくするかになってしまいます。ページングのUXを提供したい場合は普通にUICollectionViewで作るのがいいと思います。

【番外編】
iOS開発におけるウィンドウ「UIWindow」の知られざる活用方法とは?
アプリ内で様々なポップアップを出しているのですがその時にこちらの記事を参考にさせていただいた記憶があります。

##GIFアプリ(開発言語: Objective-C)で用いたもの

  • 日本で流行っているGIFを閲覧できたり実際にカメラロールの動画をGifに変換できたりとにかくGIFつくしのアプリ

Gifの表示をUIImageViewの要領で扱うことのできるライブラリです.
FLAnimatedImage
YLGifImage

この2つのうちどちらを採用するかで悩みましたが、commit率やcontributorの数などからFLAnimatedImageを採用しました。
そもそもGifって何?iOSが提供しているUIImageViewのアニメーションってどういう仕組みだっけ?っていうのをこちらの記事が噛み砕いているのでオススメです。
Gifのスピードを変えたり逆再生やシャッフルなどの機能を実装する時に知識として非常に参考になりました。

ZFModalTransitionAnimator
通常のModalやPushの画面遷移より少しリッチなアニメーションが実現できたりします。

このライブラリを使う際に
UIViewControllerTransitioningDelegate
UIViewControllerAnimatedTransitioning
について調べたことでカスタム画面遷移に強くなれた気がします。自分で好きなアニメーションを作りたいって方には中を見るのはオススメです。

GIFConverter
GIFを.MP4形式に変換してくれます。その際にスピードも調節できたりします。

ASValueTrackingSlider
UISliderの上にポップアップを付随させるライブラリ。相当便利でした。
CMPopTipViewとの組み合わせでカスタム作った方が汎用性はある気がします。

RNBlurModalView
お洒落。画像保存などした際に表示していました。

WYPopoverController
Popoverの表示に便利

YapGif
スターは少ないですが複数枚のUIImageからGifを作り出すのに結構便利
[参考]
iOS用のアニメーションgifライブラリYAPGif作った

AFNetworking
言わずもがなの有名通信系ライブラリ

###以下参考にしたもの
RMPZoomTransitionAnimator
初期のUIでGifをタップしたら浮き上がらせて画面遷移するアニメーションを実装しており、当時このライブラリを参考にしてカスタムを作っていました。オススメです。
こちらも先に述べた
UIViewControllerTransitioningDelegate
UIViewControllerAnimatedTransitioning
を理解しておいたほうが読みやすいと思います。

WaterfallLayout
PinterstのようなUIを実現するのに採用。しっかり読めばUICollectionViewFlowLayoutの基礎が身につくんじゃないかと。

##動画プラットフォームアプリ(開発言語: Swift)で用いたもの
気軽に動画投稿ができ他のユーザーとアプリ内でコミュニケーションがとれるアプリです。

SweetAlert
Swift製のお洒落なアラート。
タイプはSuccess,Error,Warning,Noneの他にCustomの画像も対応しています.

今まではポップアップやアラートを作る時にUIWindowを継承したBaseWindowを作ってさらにそれを継承した・・・って感じの構成にしてたのですがSweetAlertの中を見てからkeyWindowを取得してviewをはりつけてアニメーションさせるって構成に変えました。まあやってること自体はそんなに変わらないのですが。

KingFisher
Swiftで書かれた画像ダウンロードライブラリ。個人的にSDWebImageより使いやすいです。純正Swiftってところもいい。

SVProgressHUD
言わずもがなのHUDライブラリ。MBProgressHUDよりこっちの方がアプリデザインに合っていたから採用した。

PureLayout
AutoLayoutをシンプルなコードで書けるライブラリ。一度慣れると相当使いやすくオススメです。
使っているうちに頭の中で何となくviewの位置関係が想像できるようになります。
UITableViewAutomaticDimensionと合わせて使えば可変のCellなども簡単です。

    override func updateConstraints() {
        if alreadySetupConstraints == false {
 
            authorImage.autoSetDimensionsToSize(CGSizeMake(42, 42))
            authorImage.autoPinEdgeToSuperviewEdge(.Top, withInset: 16)
            authorImage.autoPinEdgeToSuperviewEdge(.Leading, withInset: 16)
            authorImage.autoPinEdgeToSuperviewEdge(.Bottom, withInset: 16, relation: .GreaterThanOrEqual)
            
            authorLabel.autoPinEdgeToSuperviewEdge(.Top, withInset: 17.5)
            authorLabel.autoPinEdge(.Leading, toEdge: .Trailing, ofView: commentIconImage, withOffset: 8)
            authorLabel.autoPinEdge(.Trailing, toEdge: .Leading, ofView: dateLabel, withOffset: 7, relation: .GreaterThanOrEqual)
            
            commentLabel.autoPinEdge(.Leading, toEdge: .Trailing, ofView: commentIconImage, withOffset: 10)
            commentLabel.autoPinEdge(.Top, toEdge: .Bottom, ofView: authorLabel, withOffset: 7)
            commentLabel.autoPinEdgeToSuperviewEdge(.Bottom, withInset: 12, relation: .GreaterThanOrEqual)
            commentLabel.autoPinEdgeToSuperviewEdge(.Trailing, withInset: 40)
            

            commentIconImage.autoSetDimensionsToSize(CGSizeMake(12, 11))
            commentIconImage.autoPinEdgeToSuperviewEdge(.Top, withInset: 21)
            commentIconImage.autoPinEdge(.Leading, toEdge: .Trailing, ofView: authorImage, withOffset: 16)
            
            dateLabel.autoPinEdgeToSuperviewEdge(.Right, withInset: 15)
            dateLabel.autoPinEdge(.Top, toEdge: .Top, ofView: authorLabel)
            alreadySetupConstraints = true
        }
        super.updateConstraints()
    }

上記はUICollectionViewCell内の実装の例ですが.GreaterThanOrEqualのように可変ということを直感的に書けるのは個人的にわかりやすくて好きです。

他の候補
Cartography
SnapKit

TSMessage
画面上部への通知を簡単に実装できます。
デザイン変更などもファイルで用意されているTSMessagesDegaultDesign.jsonを編集するのみ。

LockSmith
キーチェーンを簡単に扱えるラッパー。
他の候補
KeychainAccess

JTSImageViewController
Slackアプリを使っているユーザーには馴染みがあるような画像拡大のアニメーションライブラリです。
筆者がSlack好きなので採用しました.

Alamofire
AFNetworkingのSwift版ですね。Boltsと組みわせて使っています。

Bolts
非同期処理を直列で書くことができるものです。
[参考記事]
Bolts-iOSのとっても簡単な使い方説明

###以下参考にしたもの
SECoreTextView
ハッシュタグやリンク(https://〜)などにタップ判定をつけてアクションを起こすときの参考になりました。
NSRegularExpressionなどと組み合わせると独自のリンクが作れます。
[参考記事]
UITextViewでタップ可能なリンクをカスタマイズする

Chorister
Choristerは音楽ファイルを再生しながらキャッシュにいれるライブラリなのですが、アプリ内ではこちらを参考に動画ファイルを再生しながらキャッシュにいれるという実装をしました。
AVAssetResourceLoaderを使ったことがなかったため新鮮でした。
[参考記事]
iOSアプリでWeb上の音楽ファイルをHTTPストリーミング再生しながらキャッシュにも入れるライブラリ、Choristerとその実装
AVPlayerCaching

DXPopOver
CMPopTipViewに用途は近いです。Swiftに書き換えて使いました。
UIBezierPathの勉強がてら。

##動画編集アプリ(開発言語: Swift)で用いたもの
CMPopTipView
UINavigationBarButtonIやUIButtonなどを押した際にミニポップアップを表示できる。

GPUImage
前述。

###以下参考にしたもの
RAReorderableLayout
UICollectionViewのスクロール方向がVerticalのみでHorizontalはサポートされていなかったので実装には用いませんでしたが非常に参考になりました。

わりとヘビーなアプリなのですが、ライブラリはあまり用いておらずAVFoundation周りをゴリゴリって感じでした。
これについてはライブラリというより各APIとかの紹介したほうが良さそうって思いました。

余談ですが
firefox-iosのiOSアプリがソースコードを全て公開してるんですがSwiftの勉強に非常にオススメです。
凝った書き方だったりSwiftらしさを味わえるんじゃないかなーと。

public class KeyboardHelper: NSObject {
    public var currentState: KeyboardState?

    private var delegates = [WeakKeyboardDelegate]()

    public class var defaultHelper: KeyboardHelper {
        struct Singleton {
            static let instance = KeyboardHelper()
        }
        return Singleton.instance
    }

    /**
     * Starts monitoring the keyboard state.
     */
    public func startObserving() {
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "SELkeyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "SELkeyboardDidShow:", name: UIKeyboardDidShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "SELkeyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
    }

    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

特にこのKeboardHelperなどの考えは非常に参考になりました。
詳しくは中を見てみてください。

##ライブラリを探すコツ
① とりあえずGitHubの有名どころをStar順にざーっと上から見たら大体のものは抑えられるかと。
② COCOAPODS SEARCHを見る
Trending in open sourceのSwiftタグのものを見る
検索条件はtodayだったり, weeklyだったり選べます。
④ 参考にしたい動きなどを実現しているアプリの設定画面からライセンスを見る。
それなりの規模のアプリであれば割と使っているライブラリを載せています。
⑤ GitHubのCode検索
スクリーンショット 2016-04-14 10.46.52.png
ライブラリとは少し違いますが、使いたいAPIのメソッドなどで検索するとヒットするので実際に使い方を見たりするのも参考になります。

##終わりに
自分で大体作れるようになってくるにしたがってUI系などはライブラリを使うことが少なくなったなという印象です。

昔のソースコード見るのがわりと面白かったです。命名方法などは特に変わっていませんが、インデントルール守ってなかったり同じ(ような)コード大量にあったり分離が微妙だったり、さすがに成長してるなーと実感できました。

ライブラリの使い方は分かっても、どういう風に作られているのかを理解しないと、応用が利かないエンジニアになってしまうと個人的に考えています。
ですので、最近は中を見てから自分なりに書き換えて使ったり(Objective-C製のものをSwiftへ)知らないAPIなどについては調べてから使うようにしています。勿論時間も勿体ないので規模感にもよりますが・・。

あるライブラリを使う → 次から同じようなライブラリを自分で作れるようになろう
くらいの気持ちでいたようないい気がします。

400
394
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
400
394

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?