UITabBarの色変えてみた

# 本記事について
この記事では、UITabBarの色を変更する方法について紹介します。
以前の私が書いた記事で、UINavigationBarの色を変更する記事があります。今回の実装はほぼそれと同様の実装となっていますので、深い解説は割愛させていただきます。

https://qiita.com/ho_sho_/items/8a7f91af76e86f2dd0ad

## 実装内容
UIButtonをタップした時に、背景色を取得し、その色をUITabBarの背景色として設定します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625899/8cd0067c-3f57-fab5-b0ab-f8235987315e.png" width=32%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625899/ad7c0f51-5bed-d83b-8b05-9bb2a5411eea.png" width=32%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625899/be51be62-acff-9fcb-1e22-22fd0c531cb0.png" width=32%>

:::note info
下記の場合でも、背景色の状態が保存されているように実装しています。
- アプリタスクを切った時
- ホーム画面に戻って再度アプリを開けた時

:::


## 実装について

<dl>
  <dt>言語</dt>
  <dd>Swift 4</dd>
  <dt>エディタ</dt>
  <dd>Xcode 15.1</dd>
  <dt>iOS</dt>
  <dd>17.0</dd>
</dl>

## サンプルコード

今回紹介する機能を実装したサンプルとして、GithubのURLを下記に記載します。

https://github.com/9-sho-5/change-tabbar-color

## ソースコード全体

``` ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    // TabBarの背景色を保存するためのUserdDefaults
    var tabBarColorData: UserDefaults = UserDefaults.standard
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // アプリ初回起動の際，現状のTabBarの背景色をUserDefaultsに保存する
        if let colorString = tabBarColorData.string(forKey: "tabBarColor"),
           let colorData = Data(base64Encoded: colorString),
           let barColor = try? NSKeyedUnarchiver.unarchivedObject(ofClass: UIColor.self, from: colorData) {
            changeTabBarColor(barColor)
        }
        
    }
    
    /**
     色ボタンをタップするとタブバーの背景色を変更する
     */
    @IBAction func changeColorButtonTapped(_ sender: UIButton!) {
        
        if let backgroundColor = sender.backgroundColor {
            changeTabBarColor(backgroundColor)
        } else {
            fatalError("ボタンの背景色を取得できませんでした．")
        }
        
    }
    
    /**
     タブバーの背景色を変更する関数
     */
    func changeTabBarColor(_ barColor: UIColor) {
        
        // UITabBarの外観を設定
        let tabBarAppearance = UITabBarAppearance()
        tabBarAppearance.backgroundColor = barColor
        
        UITabBar.appearance().standardAppearance = tabBarAppearance
        if #available(iOS 15.0, *) {
            UITabBar.appearance().scrollEdgeAppearance = tabBarAppearance
        }
        
        // タブバーアイテムの色
        UITabBar.appearance().tintColor = UIColor.white
        UITabBar.appearance().unselectedItemTintColor = UIColor.lightGray
        
        
        // 既存のタブバーに変更を反映させる
        if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
           let window = windowScene.windows.first {
            for view in window.subviews {
                view.removeFromSuperview()
                window.addSubview(view)
            }
        }
        
        // UIColorを文字列に変換
        if let colorData = try? NSKeyedArchiver.archivedData(withRootObject: barColor, requiringSecureCoding: false) {
            let colorString = colorData.base64EncodedString()
            
            // UserDefaultsにタブバーの背景色を文字列で保存する
            tabBarColorData.set(colorString, forKey: "tabBarColor")
            
        }
    }   
}
```

## 参考文献

https://developer.apple.com/documentation/uikit/uibarappearance