[iOS]ローディングをいい感じに表示してくれるCocoaPodsライブラリ「KRProgressHUD」の宣伝

簡単で使いやすく，かっこいいローディングといえば，[SVProgressHUD](https://github.com/SVProgressHUD/SVProgressHUD) や [MBProgressHUD](https://github.com/jdg/MBProgressHUD) あたりが定番かと思います．

私は最近，Swiftにもだいぶ慣れてきたので，面倒な処理を投げれるUtilityやExtensionを書く機会が増えてきました．
CocoaPodsライブラリを公開したことがなかったこともあり，経験という意味でも，ローディングを表示するライブラリを上のPodsを参考にしながら作成してみました．
差分を図るために，**インジケータのデザイン**，**ピュアSwift**といった点をを意識してみました．

# 完成したもの
デモ: https://appetize.io/app/nw022juw0znkf1n5u6ynga5ntm
Github: https://github.com/krimpedance/KRProgressHUD
[README.md](https://github.com/krimpedance/KRProgressHUD/blob/master/README_Ja.md)を見ていただければ，簡単に使うことができると思います．

<img src="https://github.com/krimpedance/KRProgressHUD/blob/master/Resources/demo.gif?raw=true" height=400>
(＊このGifは最新版ではないですが，挙動はだいたい同じです．)
　
#### **特徴**
- MaskViewの色：`.black`, `.white`, `.clear`から選択
- progressHUDの背景色：`.white`, `.black`, `.custom(background:, text:, icon:)`
- KRActivityIndicator(クルクル)：開始色と終了色を指定することで，グラデーションのあるインジケータを表示
- カスタム画像も設定可能
- その他の細かいところは[デモアプリ](https://github.com/krimpedance/KRProgressHUD/tree/master/DEMO)で確認していただけると嬉しいです！


# KRActivityIndicatorView
<img src="https://qiita-image-store.s3.amazonaws.com/0/93219/30730804-26b2-5bc6-890d-b36859eb9633.png" width=100> <img src="https://qiita-image-store.s3.amazonaws.com/0/93219/1c21be22-d6d4-3403-388b-0d86250da852.png" width=100> <img src="https://qiita-image-store.s3.amazonaws.com/0/93219/dd0e433b-cc8b-32e7-1e3c-45b9a15d7645.png" width=100> <img src="https://qiita-image-store.s3.amazonaws.com/0/93219/5d3fd811-ceb1-adfd-37e8-cf205796b10b.png" width=100> <img src="https://qiita-image-store.s3.amazonaws.com/0/93219/063ccc2f-0c06-af4f-27f4-303d63c852c3.png" width=100>

まず初めにクルクル回るインジケータを作成しました．
画像を使うという手もありましたが，使う側のことを考えてインジケータの色はバリエーションをもたせたかったので，`UIBezierPath`で描画してます．


基本のデザインはIllustratorで作り，自前の[パス変換ツール](http://qiita.com/krimpedance/items/893ecb5bdfc515fe8eb2)により`UIBezierPath`化しています．

```swift
paths.enumerated().forEach { index, path in
  let pathLayer = CAShapeLayer()
  pathLayer.frame = animationLayer.bounds
  pathLayer.fillColor = colors[index].cgColor
  pathLayer.lineWidth = 0
  pathLayer.path = path
  animationLayer.addSublayer(pathLayer)
}
```

インジケータの各丸は色が異なるため，別々のレイヤで描画しています．
各色は，グラデーションから等間隔で抽出したものを使用しました．(抽出に関しては[こちら](http://qiita.com/krimpedance/items/bff56a2533d2c1e431cb)にまとめてあります．)

#### **副産物**
このインジケータは今回のライブラリ用に作っていたのですが，普通に`UIActivityIndicator`のように使えるのでは？となり，諸々の処理を追加，別のライブラリとして公開することにしました．(笑)
Github: https://github.com/krimpedance/KRActivityIndicatorView
デモ: https://appetize.io/app/v73ez7gvuzzuhxecu4zqv4em0r 

`IBDesignable`と`IBInspectable`を使用することで，IB上でデザインを調節できます．
色を自在に(と言っても2色のグラデーションですが)変えれるので，アプリのUIに合わせやすいかと思います．

# KRProgressHUD
CocoaPods化するにあたっては，以下の記事を参考にさせていただきました.

- [自前のライブラリをCocoaPodsで管理するメモ](http://qiita.com/somtd/items/9386e2185adfff4c54bc)
- [【Swift】CocoaPodsに自作ライブラリを登録](http://qiita.com/taji-taji/items/e23373f9b8124de728a2)

途中まではうまくいっていたのですが，実際に`pod install`してデモを作ろうとすると読み込みはうまくいくのにクラスが使えない，，，
という状況に陥り何回もやり直したり`.podspec`いじったりして，数時間が消えていきました．

まあ原因は，**外から使いたいものに`public`修飾子をつけていなかった**だけでした．．orz

`private`修飾子は意識してつけまくっていたのですが，何もつけない場合は`internal`になり，ライブラリ化した場合はアクセスできないということを完全に忘れていました．
普段使うUtilityファイルはプロジェクトにそのままぶち込んで使っていたので問題になっていなかっただけでした．
まあ今回の件で`public`と`internal`の動作の違いについて学べたので良しとしましょう．(^^;

# まとめ
今回は既存のライブラリ+αといった感じでしたが，CocoaPodsのライブラリ作成の流れなどがわかり，楽しかったです．
ここもカスタムしたい！とか，この書き方はFxxk you!などありましたら，コメントまたはGithubの方からお願いします．


それではよいiOSライフを！！！

#### 更新履歴
---
+ 2017/07/04 ver.3.0 用に更新しました．