Swift製のHUDライブラリ PKHUD

# はじめに
HUDライブラリとして最も有名なのはSVProgressHUDだと思いますが、今回はSwiftでできている`PKHUD`を調べてみました。

# なぜ`PKHUD`なのか

GitHubで`HUD`かつ言語がSwiftで検索した結果、のスター数が一番多かったからです。(2018 12/10時点)

- [PKHUD](https://github.com/pkluz/PKHUD)
- [SwiftNotice](https://github.com/johnlui/SwiftNotice)
- [KRProgressHUD](https://github.com/krimpedance/KRProgressHUD)
- [VHUD](https://github.com/xxxAIRINxxx/VHUD)


ざっくり比較

|ライブラリ名|スター数|Swift|Xcode|その他|
:----:|:-----:|:----:|:------:|:----:|:--------:
PKHUD|3,057|4.2|Xcode 10| 
SwiftNotice|755|4.0|Xcode 9.3|インストール方法がマニュアルのみ
KRProgressHUD|338|4.2|Xcode 10|日本語ドキュメントがある
VHUD|138|4.2|Xcode 10|




# PKHUDについて

## 特徴
- Appleのデザインをもとに作られている
- 表示もとのViewを明示的に指定できる
- カスタマイズ性が高い


## 使い方

**基本操作**

簡単にHUDを表示できる`HUD`クラスが提供されています。
これを使うことでとても簡単にローディングやステータスを表示することができます。

```swift
// HUDを表示
HUD.show(.progress)
HUD.show(.progress, onView: view) // 表示もとのviewを明示的に指定

// HUDを表示して指定時間後に非表示にする
HUD.flash(.progress, delay: 3)
// HUDを出し終わったあとのタイミングが取れる
HUD.flash(.success, onView: view, delay: 2) { _ in
            // HUDを非表示にしたあとの処理
        }

// HUDを非表示にする
HUD.hide()
HUD.hide { _ in
            // HUDを非表示にしたあとの処理
        }

```

**指定できるType**

```swift

public enum HUDContentType {

    case success

    case error

    case progress

    case image(UIImage?)

    case rotatingImage(UIImage?)

    case labeledSuccess(title: String?, subtitle: String?)

    case labeledError(title: String?, subtitle: String?)

    case labeledProgress(title: String?, subtitle: String?)

    case labeledImage(image: UIImage?, title: String?, subtitle: String?)

    case labeledRotatingImage(image: UIImage?, title: String?, subtitle: String?)

    case label(String?)

    case systemActivity
}

```

例)
**success**
![スクリーンショット 2018-12-10 22.21.06.png](https://qiita-image-store.s3.amazonaws.com/0/308861/daeb826d-cc08-4276-1480-ee73679aa44a.png)

**error**
![スクリーンショット 2018-12-10 22.18.49.png](https://qiita-image-store.s3.amazonaws.com/0/308861/9f7c973a-afc8-1142-5c04-37b00e5263f7.png)

**progress**
![スクリーンショット 2018-12-10 22.29.08.png](https://qiita-image-store.s3.amazonaws.com/0/308861/8994d1f9-5cb2-048d-75e4-cdd6e4e00afa.png)

**背景**
背景を暗くするかどうかを設定することができます。
デフォルトで暗くなる設定になっています。

```swift
HUD.dimsBackground = false
HUD.show(.progress, onView: view)
```

|dimsBackground|true|false|
:-----:|:----:|:------:
||<img src="https://qiita-image-store.s3.amazonaws.com/0/308861/8994d1f9-5cb2-048d-75e4-cdd6e4e00afa.png">|<img width=414 alt="スクリーンショット 2018-12-11 16.56.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/308861/a1e3d48e-a4e2-3514-b8f7-ddf3c1766268.png">|

## カスタマイズについて
`HUD`で提供されているもので充分使えますが、カスタマイズしたいということはあると思います。
その場合は、`PKHUD`を使用します。
`PKHUD.sharedHUD.contentView`にカスタマイズしたViewを設定することで実現できます。
PKHUDですでに定義されたView(`PKHUDSquareBaseView`、`PKHUDWideBaseView`)を使うと簡単にカスタマイズできます。

例)

```swift
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        PKHUD.sharedHUD.contentView = CustomHUDView(image: PKHUDAssets.checkmarkImage, title: "Success!", subtitle: nil)
        PKHUD.sharedHUD.show(onView: view)
    }
}

class CustomHUDView: PKHUDSquareBaseView {

    override init(image: UIImage?, title: String?, subtitle: String?) {
        super.init(image: image, title: title, subtitle: subtitle)

        titleLabel.textColor = UIColor.lightGray
        backgroundColor = UIColor(red: 0xAB/0xFF, green: 0xD2/0xFF, blue: 0xFC/0xFF, alpha: 1.0)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}
```

![スクリーンショット 2018-12-11 2.28.35.png](https://qiita-image-store.s3.amazonaws.com/0/308861/984f2c59-3719-3556-a322-a6d58f4494a1.png)

**注意点**
`PKHUDSquareBaseView`をカスタマイズしましたが、ローディングを表示したい場合はローディング機能を持ったViewを`PKHUD.sharedHUD.contentView`に再度設定します。
表示したい内容によって、`PKHUD.sharedHUD.contentView`を都度変える必要があるので`PKHUD`を拡張するのがいいかなと思いました。

文字色を変えたいだけとかだと少し手間ですね、、、


# まとめ
Swift製のHUDライブラリ`PKHUD`についてでした。
基本的にシンプルで使いやすいなという印象です。
長くSVProgressHUDにお世話になってきましたが、Swiftで作られたPKHUDを使ってみたいと思いました。