Status barの設定を変更する childForStatusBarStyle・preferredStatusBarStyle編

目指せStatus barマスター その2。

開発環境

> xcodebuild -version
Xcode 14.0
Build version 14A5229c

Xcodeはbetaだが本記事の内容はiOS16未満のAPIを使用。

モチベーション

Status barマスターになりたい。Status barの設定をシュッと変えられるようにする。

UIViewControllerが持つStatus bar関係のプロパティ・メソッド

現時点で使用可能なプロパティ・メソッドは7つある。多い。

順に見ていく。本記事はchildForStatusBarStyleとpreferredStatusBarStyleを試す。

childForStatusBarStyle

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621433-childforstatusbarstyle

If your container view controller derives its status bar style from one of its child view controllers, implement this method and return that child view controller. If you return nil or do not override this method, the status bar style for self is used. If the return value from this method changes, call the setNeedsStatusBarAppearanceUpdate() method.

「コンテナview controllerが子view controllerの1つからStatus bar styleを取得する場合は、このメソッドを実装して、その子view controllerを返します。 nilを返すか、このメソッドをオーバーライドしない場合、selfのStatus bar styleが使用される 。」

前回(↓)のstyleバージョンっぽい。

tokizuoh.hatenablog.com

さっそく書いてみた。

スクリーンショット

A B

グレーの部分が子view controller。

  • A: 子view controllerで preferredStatusBarStyle.lightContent
  • B: 子view controllerで preferredStatusBarStyle.darkContent

コード

import UIKit

final class ViewController: UIViewController {
    override var childForStatusBarStyle: UIViewController? {
        if let child = children.first as? ChildViewController {
            return child
        }
        return nil
    }
}

final class ChildViewController: UIViewController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

所感

preferredStatusBarStyle を設定する時にどっちがどっちだったかで迷いそう。.lightContent はライトモードの表示=Status barの表示要素が黒色、ということではなく、Status barの表示要素自体がライト。

参考