iOS用アイコンフォントライブラリ「IconFontStack」を作って公開しました

[株式会社LITALICO](http://litalico.co.jp/) でエンジニアをやっています、[@kentya6](https://qiita.com/kentya6)です。
『[LITALICO Advent Calendar 2017](https://qiita.com/advent-calendar/2017/litalico)』18日目の記事となります。

今回、iOS向けのアイコンフォントライブラリ「[IconFontStack](https://github.com/kentya6/IconFontStack)」を作りましたので、開発の背景やライブラリの使い方などを書いていきます。

# 開発背景
私自身、アプリを作成する際によくアイコンフォントを使用します。主に以下の理由からアイコンフォントを使用しています。

- 自分で画像リソースを用意する必要がない
- 高品質なアイコンを手軽に使える
- UIに使用するアイコンは既にアイコンフォントでカバーできることが多い

これまで既存のアイコンフォントライブラリを使って開発を進めていましたが、いくつか痒いところに手が届かない感じがありました。
例えば、

- 文字列で指定する必要がある
- Storyboardで確認できない
- 提供しているメソッドが複雑(Buttonの枠線指定などもあり引数が多い)

上記の項目を一部クリアしているライブラリももちろんありますが、今回挙げた項目を全てクリアするライブラリは見当たりませんでした。
そのため、自分で作ることにしました。

# ライブラリの特徴
先程の開発背景に挙げた部分を解決する機能を持っています。

## 1. 複数フォントに対応
現時点では以下のフォントに対応しています。

- [FontAwesome](http://fontawesome.io/)
- [ionicons](http://ionicons.com/)
- [MaterialDesignIcons](https://material.io/icons/)

だいたいこの辺りのフォントを使うことが多いのでこの3つにしていますが、必要に応じて追加予定です。

## 2. enumによる補完
文字列を直接指定する方法では、アイコンの指定ミスをコンパイルによるチェックで検出することができません。
また、補完がないので正しいかどうか確認する手間があります。
そこで本ライブラリでは、以下のような記述でアイコンを指定できるようにしています。
アイコンのサイズや色も指定できます。

#### UILabel
```swift
label.setIcon(icon: .googleMaterialDesign(.settings), size: 30)
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/2037/35f91d37-1fbc-dd5c-aead-d3d7ff9a2213.png" width=7%>


#### UIButton
```swift
button.setIcon(icon: .fontAwesome(.heart), forState: .normal)
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/2037/27c00101-2249-1bad-2e6d-1a9b105439b5.png" width=7%>

#### UITextField
```swift
textField.setRightViewIcon(icon: .fontAwesome(.addressBook))
textField.setLeftViewIcon(icon: .fontAwesome(.adn))
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/2037/6a26ac70-dcaf-dab9-002c-2530c0c3127c.png" width=15%>

#### UIStepper
```swift
stepper.setIncrementIcon(icon: .ionicons(.alert), forState: .normal)
stepper.setDecrementIcon(icon: .ionicons(.leaf), forState: .normal)
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/2037/72a33f0f-af2f-e0c8-21f6-649b520f9a33.png" width=15%>


#### UISlider
```swift
slider.setMinimumValueIcon(icon: .fontAwesome(.home))
slider.setMaximumValueIcon(icon: .fontAwesome(.key))
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/2037/b8d27d60-187a-dc2b-bc5e-f06a9ec87db7.png" width=25%>

#### UIImageView
```swift
imageView.setIcon(icon: .fontAwesome(.star), color: .orange, size: CGSize(width: 44, height: 44))
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/2037/0b5b3bd7-304d-5a0f-e458-dcd527d1da4c.png" width=7%>

#### UISegmentedControl
```swift
segmentedControl.setIcon(icon: .googleMaterialDesign(.shop), forSegmentAtIndex: 0)
segmentedControl.setIcon(icon: .googleMaterialDesign(.openInNew), forSegmentAtIndex: 1)
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/2037/edfc8060-ab1c-2ba2-e7bc-139900e49b2a.png" width=20%>


## 3. Storyboardでのプレビュー
本ライブラリでは、`IconFontButton`, `IconFontImageView`, `IconFontLabel`などといったクラスを提供しています。（クラス一覧は[README](https://github.com/kentya6/IconFontStack#support-ibdesignable)にあります）
これらのクラスは`@IBDesignable`に対応しているので、storyboardでアイコン指定することもできます。

### 例: Storyboard上でUILabelにアイコンフォントを適用
まず、UILabelを置き、クラス名を`IconFontLabel`に変更します。
インスペクタ欄に「Icon Id」という欄が出るので、そこにアイコンフォントのidを入力します。
（例: [FontAwesomeのcheckアイコン](http://fontawesome.io/icon/check/)を使いたい場合は`fa-check`と入力)
正しくidが入力された場合、自動的にアイコンが画面上に反映されます。

以下のデモ動画では、FontAwesomeの`fa-bus`、ioniconsの`ion-ios-email`、MaterialDesignIconsの`ic-settings`を入力しています。ボタン部分のアイコンが変わっているのが分かると思います。

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/2037/6d78e733-86dc-d18e-a8a5-7fce32906a90.gif)

# おわりに
今回は、今まで別のアイコンフォントライブラリを使っていて感じた個人的な不満を解決するライブラリを作ってみました。
今後、アイコンフォントを使用する際は[IconFontStack](https://github.com/kentya6/IconFontStack)を使ってアプリ開発をしていく予定なので、足りない部分はアップデートとして追加していきます。(特にUINavigation関係)
もしよければみなさんも使ってみて下さい。

明日は @tomotomospot さんの「情報のキャッチアップ力を少しだけ上げる方法」です。お楽しみに！