SwiftでStatusBarの色を変えたり消したりする方法

公開: 2018-10-31 06:06

こんにちは。あっきぃです。

先日、窓の内側と外側で磁石で挟み込んで拭く掃除グッズで窓掃除をしました。

もちろん専用の落下防止の紐を付けてましたが、落ちるんじゃないかとヒヤヒヤしました。このスリルがたまらないですね。


ということで、今日はiPhoneアプリでおなじみのStatusBarのお話です。

消したり、色を変えたりをコードで表現したいと思います。さっそくいきましょう。環境はXcode10.0でSwift4.2です。



1.View controller-based status bar appearanceをYESにする

1.View controller-based status bar appearanceをYESにする

Info.plistの「View controller-based status bar appearance」をYESにします。

YESにすると、ViewControllerごとにappearanceを変更できる的なノリになる気がするからです。

別にNOでも行ける気がしてきました。



2.UIViewControllerのサブクラスを作ります

// ViewController.swift

import UIKit

class ViewController: UIViewController {

        // StatusBarHidden
        private var _statusBarHidden: Bool = false
        var statusBarHidden: Bool {
                get { return _statusBarHidden }
                set(value) { setStatusBarHidden(hidden: value) }
        }

        func setStatusBarHidden(hidden: Bool, animated: Bool = true) {
                _statusBarHidden = hidden
                if !animated { return setNeedsStatusBarAppearanceUpdate() }
                UIView.animate(withDuration: 0.2) {
                        self.setNeedsStatusBarAppearanceUpdate()
                }
        }

        override var prefersStatusBarHidden: Bool {
                return _statusBarHidden
        }

        // StatusBarStyle
        private var _statusBarStyle: UIStatusBarStyle = .default
        var statusBarStyle: UIStatusBarStyle {
                get { return _statusBarStyle }
                set(value) { setStatusBarStyle(style: value) }
        }

        func setStatusBarStyle(style: UIStatusBarStyle, animated: Bool = true) {
                _statusBarStyle = style
                if !animated { return setNeedsStatusBarAppearanceUpdate() }
                UIView.animate(withDuration: 0.2) {
                        self.setNeedsStatusBarAppearanceUpdate()
                }
        }

        override var preferredStatusBarStyle: UIStatusBarStyle {
                return _statusBarStyle
        }
}

prefersStatusBarHiddenpreferredStatusBarStyleのメソッドで、StatusBarの表示非表示とスタイルを指示するので、overrideして自由に変えられるようにしています。

setNeedsStatusBarAppearanceUpdate()を呼べば、statusBarが更新されます。アニメーション内に入れると、変更時にアニメーションがかかります。



3.UINavigationControllerのサブクラスを作ります

// NavigationController.swift

import UIKit

class NavigationController: UINavigationController {

        override var childForStatusBarStyle: UIViewController? {
                return visibleViewController
        }

        override var childForStatusBarHidden: UIViewController? {
                return visibleViewController
        }
}

StatusBarの状態を常に先頭のViewControllerに従わせてます。多分。



4.使ってみます


NavigationControllerとViewControllerは、


let vc = ViewController()
let nav = NavigationController(rootViewController: vc)

的な感じで使ってください。

別にナビゲーション使わないならViewControllerだけで。

基本的にはViewControllerのサブクラスをさらに作って、ごにょごにょすることになるでしょう。


4.1.StatusBarを非表示にする

vc.statusBarHidden = true
vc.setStatusBarHidden(hidden: true, animated: false)

こんな感じ。

アニメーションさせたくない場合はsetStatusBarHiddenでanimatedにfalseを渡します。

おそらくViewControllerの内部から呼び出すことが多いので「(self.)statusBarHidden = false」とかになるでしょう。



4.2.StatusBarのスタイルを変更する

vc.statusBarStyle = .lightContent
vc.setStatusBarStyle(style: .default, animated: false)

こんな感じ。

同じくアニメーションさせたくない場合はsetStatusBarHiddenでanimatedにfalseを渡します。



以上です。

これでスッキリですね。ではでは。



この記事をシェア
この記事にコメントする
書き込む
あっきぃ(@appstars_aki)
Web、iOSなフリーランサーです。好きなものはお寿司です。でもお寿司は高いので普段は雑草とか拾ったドングリを食べています。お仕事や意味もなく毎月お小遣いをくれる人を探してます。

お仕事の依頼や自分で作ったアプリのレビューを希望しちゃう方はaki@appstars.jpまでご連絡ください。