会社で約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検索
ライブラリとは少し違いますが、使いたいAPIのメソッドなどで検索するとヒットするので実際に使い方を見たりするのも参考になります。
##終わりに
自分で大体作れるようになってくるにしたがってUI系などはライブラリを使うことが少なくなったなという印象です。
昔のソースコード見るのがわりと面白かったです。命名方法などは特に変わっていませんが、インデントルール守ってなかったり同じ(ような)コード大量にあったり分離が微妙だったり、さすがに成長してるなーと実感できました。
ライブラリの使い方は分かっても、どういう風に作られているのかを理解しないと、応用が利かないエンジニアになってしまうと個人的に考えています。
ですので、最近は中を見てから自分なりに書き換えて使ったり(Objective-C製のものをSwiftへ)知らないAPIなどについては調べてから使うようにしています。勿論時間も勿体ないので規模感にもよりますが・・。
あるライブラリを使う → 次から同じようなライブラリを自分で作れるようになろう
くらいの気持ちでいたようないい気がします。