iOS7以降から有効になったprefersStatusBarHidden
を使う。
Info.plist
View controller-based status bar appearance
キーを追加してYES
を設定。
prefersStatusBarHidden
StatusBarを隠したいViewControllerで以下を実装。
override var prefersStatusBarHidden: Bool {
return true
}
問題点 1
StatusBarStyleが死ぬ
StatusBarを白くしたいので設定していた以下の内容が無効になる。
- Info.plistの
Status bar style
のUIStatusBarStyleLightContent
- AppDelegateで実装していた
application.statusBarStyle = .lightContent
解決策
ViewControllerに以下を実装したら解決した。
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
問題点 2
LandscapeでStatusBarが消えない
今までLnadscapeModeになると自動的にStatusBarが非表示になっていたのに表示されてしまう。
-> View controller-based status bar appearance
をYES
に設定したせいだと思う。
解決策
LandscapeとPortrateに突入する際にprefersStatusBarHidden
がコールされるので、そこで適切な値を返してあげればよい。
例としては以下。
class ViewController: UIViewController {
var isStatusBarHidden = false
override var prefersStatusBarHidden: Bool {
return isStatusBarHidden
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
NotificationCenter.default.addObserver(self, selector: #selector(didRotateScreen), name: .UIApplicationDidChangeStatusBarOrientation, object: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func tapButton(_ sender: UIButton) {
isStatusBarHidden = !isStatusBarHidden
setNeedsStatusBarAppearanceUpdate()
}
func didRotateScreen() {
if UIDevice.current.orientation.isLandscape {
isStatusBarHidden = true
} else if UIDevice.current.orientation.isPortrait {
isStatusBarHidden = false
}
}
}
余談
上記のコードで記述している@IBAction func tapButton
は、storyboardに配置した"StatusBarの表示/非表示を切り替えるボタン"に接続するIBActionです。
メソッド内で実行しているsetNeedsStatusBarAppearanceUpdate()
は、実行した時点でStatusBarの表示を更新してくれます。(すなわちprefersStatusBarHidden
が実行される)