アプリをそれっぽく見せるNavigationBarとTabBarの色の変え方　Swift初心者向け

# 完成品
![tab_qiita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/f974aa05-2f5e-2af1-cee5-5ffc35a64f72.gif)


# 対象
・iOSアプリの開発初心者で、それっぽいアプリ作りたいなと思っている方。
・Navigation Bar をカスタムしたいなと思っている方。
・Tab Bar をカスタムしたいなと思っている方。
・毎回 UIColor 使って入力するの面倒だなと思っている方。

# 開発環境
Xcode10.2
Swift5

# 概要
1. Navigation Bar と Tab Bar の使い方がわかる！(Controller も)
2. 色を一元管理することで、色の指定、色の変更を簡単にする！
3. Navigation Bar と Tab Bar の色を統一して、アプリっぽさを出す！

# セットアップ
コードを書く前に、Xcode を触っていきます!
## プロジェクトの立ち上げ
<img width="849" alt="スクリーンショット 2019-04-12 12.58.40setup.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/b5dc8383-7d12-b2c4-f130-9b38eb1d1078.png">

## 画面の準備

### 1. 初期の View Controller の削除
Main.storyboard にある ViewController は使わないので、消し去りましょう。
<img width="1091" alt="スクリーンショット 2019-04-12 13.03.37remove.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/4ceeb86b-e00c-3e2b-0ccc-9edc3bf90305.png">

### 2. Tab Bar Controller を入れる
次に Tab Bar Controller を Storyboard に挿入します。
1. Library をクリック
2. 検索欄に tabbar と入力
3. 結果に出てきた、Tab Bar Controller をドラッグ&ドロップで召喚

<img width="1091" alt="スクリーンショット 2019-04-12 13.04.04addtab.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/475699d7-6c48-bb5e-c053-5d7829be183b.png">
4. OK！
<img width="1397" alt="スクリーンショット 2019-04-12 13.04.35addedTabbar.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/a1305845-937c-a147-7c05-c31a14bdd69b.png">

#### Tab Bar Controller をちょっとだけ編集
アイコンがデフォルトだと味気ないので、変更します！
1. Tab Barを選択
2. System Item から好きなものを選択
3. OK!
(もう１つの画面も同様に編集)
<img width="959" alt="スクリーンショット 2019-04-12 13.24.15.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/fcaf6aa3-22b8-4922-6b3f-b0fe1cd83bea.jpeg">


### 3. Navigation Controller を入れる
1. Tab Bar Controller の次の画面の上にある黄色いところを選択
2. Editor を選択
3. Embed In → Navigation Controller を選択
<img width="938" alt="スクリーンショット 2019-04-12 13.05.14addEmbedIn_navigationbar.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/3b058bcb-e3bd-d6da-1454-4551ab382e8b.jpeg">
4. 完成！(もう１つの画面も同様に編集)
<img width="938" alt="スクリーンショット 2019-04-12 13.05.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/fba66a13-7a85-a4e4-1cd9-293e48005fde.png">

#### Navigation Bar をちょっとだけ編集
タイトルを入れましょー！
1. Navigation Barをクリック
2. Titleを編集
3. OK!
(もう１つの画面も同様に編集)

<img width="566" alt="スクリーンショット 2019-04-12 13.08.03.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/f97f4046-07aa-1001-6b43-6cc6fd9cd61e.jpeg">


### Is initial View Controllerの設定
最初に View Controllerを消してしまったので、 Is initial View Controllerの設定がなくなってしまいました。
このまま、プロジェクトをビルドしてRunすると、どの ViewController を表示すれば良いのかがわからず、下記のエラーが発生してしまうのでここで設定しておきます。

```
Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set?
```

1. 黄色のところを選択
2. Is initial View Controller を選択
3. 矢印があればOK!
![スクリーンショット 2019-04-12 22.28.51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/7642031a-34e5-d34c-07da-83eaa8b35ea2.jpeg)


# 実装
## UIColor を継承したクラス作成
なぜ UIColor を継承したクラスを作成するかというと、１つのファイルで色の指定を管理したいからです。
Tab Bar などのアイテムに色をつける際に、１つ１つの画面で色を設定するのは面倒です。
例えば、全ての画面で Tab Bar の色を黒(#000000)にしていたとします。
色の変更したいな〜と思って、白（#FFFFFF)にすることになったとしたら、全ての画面に適用されているソースコードを変更しなければなりません。
10画面あったら、10個もコードを変更する手間がかかります。


色の指定を１つのクラスにし、そのクラスのプロパティを参照することで、**１つのクラスで色を管理できる**ようにでき、修正が簡単になり、保守性が上がります！


また、UIColor を継承しているクラスを作成することによって、**「プロジェクトで利用する色なんだ」**とクラスを見ただけで、他の人（共同開発したり、保守運用をしている人）に意図が伝わるというメリットもあります。

1. Ctrl + N でファイル作成 (Swift File)
2. SoreppoiAppColor.swift ファイル選択(ファイル名は適当に。プロジェクト名＋Color だと分かりやすいかも)
3. 以下のコードを記述


```swift:SoreppoiAppColor.swift

import Foundation
import UIKit

class SoreppoiAppColor {
    // 濃い緑を返す
    class var primary: UIColor {
        return rgbColor(rgbValue: 0x73C6B6)
    }
    
    // 薄いオレンジを返す
    class var secondary: UIColor{
        return rgbColor(rgbValue: 0xFFD6BA)
    }
    
    // 白っぽい灰色を返す
    class var background: UIColor{
        return rgbColor(rgbValue: 0xFAF9F9)
    }
    
    // #FFFFFFのように色を指定できるようにするメソッド！色が使いやすくなる。
    // ここでしか使わないので privateメソッドにする。
    private class func rgbColor(rgbValue: UInt) -> UIColor{
        return UIColor(
            red:   CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((rgbValue & 0x00FF00) >>  8) / 255.0,
            blue:  CGFloat( rgbValue & 0x0000FF)        / 255.0,
            alpha: CGFloat(1.0)
        )
    }
}

```

#### 追記 2019/04/16
@k-kohey さんのアドバイスがコメント欄にあります。
クラスを継承しなくても、enumで定義できる方法もコメント欄にありますので見ていただきたいです。
koheyさん、ありがとうございます！！



## Tab Bar Controller ファイルを作成
### 目的：Tab Bar の色を変更する
1. Ctrl + N でファイル作成 (Cocoa Touch Class)
2. 「Subclass of: 」　で　UITabBarController　を選択して作成 （Class名は適当に）
<img width="1140" alt="スクリーンショット 2019-04-12 13.10.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/38d61546-e175-7a9b-ad95-7cba2052f1fc.png">


3. 以下のコードを記述。コードの説明は、コメントにて。
（追記部分以外は最初から記述してあります。）

```swift:SoreppoiAppTabBarController.swift

import UIKit

class SoreppoiTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // -----＊＊追記部分＊＊----- //
        // アイコンの色を変更できます！
        UITabBar.appearance().tintColor = SoreppoiAppColor.secondary
        // 背景色を変更できます！
        UITabBar.appearance().barTintColor = SoreppoiAppColor.primary
        // -----＊＊追記部分＊＊----- //
    }

}

```

4_  Tab Bar Controller に、swift ファイルを適用
このままでは Tab Bar Controller と、SorreppoiAppTabBarController.swift ファイルが**別々のもの(連携していない)**になっているので、swift ファイルで Tab Bar Controller で制御できるようにしましょう！

### Main.storyboard を開いて、Tab Bar Controller に swift ファイルを適用
<img width="823" alt="スクリーンショット 2019-04-12 13.11.54.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/19c7c851-61e1-2f28-f4a0-f3a1a3fe96d5.jpeg">


## Navigation Bar の色を変更
### AppDelegate.swift のコードを修正
なぜ function にしているかというと、function名を使ってどのような処理をしているかが、直感的にわかるからです!
もちろん function化せずに処理を書いても良いのですが、パッと見ただけですぐに処理内容がわからず、処理を読み解く時間が発生します。
function化することで、誤った解釈を防ぐことができ、可読性も向上します！

追記部分だけ記述してください！

```swift:AppDelegate.swift
import UIKit
import CoreData

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        // -----＊＊追記部分＊＊----- //
        changeNavigationBarColor()
        // -----＊＊追記部分＊＊----- //
        return true
    }
    // -----＊＊追記部分＊＊----- //
    func changeNavigationBarColor() {
        // 全てのNavigation Barの色を変更する
        // Navigation Bar の背景色の変更
        UINavigationBar.appearance().barTintColor = SoreppoiAppColor.primary
        // Navigation Bar の文字色の変更
        UINavigationBar.appearance().tintColor = SoreppoiAppColor.secondary
        // Navigation Bar のタイトルの文字色の変更
        UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: SoreppoiAppColor.background]
    }
    // -----＊＊追記部分＊＊----- //


///ここから先は省略///

```

# 完成したそれっぽいアプリ（再度掲載）
![tab_qiita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/f974aa05-2f5e-2af1-cee5-5ffc35a64f72.gif)


# まとめ
Navigation Bar と Tab Bar の色を統一してみるだけでなんか**それっぽいアプリ**に見えませんか！？（自分だけかな。）
この画面をベースにアプリ開発をしていくと少しだけテンション上がります。それっぽく見えるかもなんで！
Navigation Controller を使っているので、次の画面に遷移した時に、上に 「**<戻る**」 も付くので便利ですよ！

長文でしたがお読みいただきありがとうございました。

この投稿が**誰かの手助け**となると、とても嬉しいです！
ぜひコメントください。

間違っている点、もっとこうした方がいいよ、という点などご指摘お待ちしております！
よろしくお願いいたします。


# 参考にさせていただいた記事
@senseiswift さん
[ExtensionでUIColorにブランドカラーを返す拡張メソッド追加](https://qiita.com/senseiswift/items/11ad4da513181781b3af)

コードログ
[Swift – iOS：ナビゲーションバーの色を変更する](https://codeday.me/jp/qa/20190301/344954.html)