Swift iOSアプリでステータスバーを非表示にするにはどうすればよいですか?


201

画面上部のステータスバーを削除したいのですが。

これは動作しません:

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
        application.statusBarHidden = true
        return true
}

私も試しました:

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    var controller = UIViewController()
    application.statusBarHidden = true
    controller.setNeedsStatusBarAppearanceUpdate()

    var view = UIView(frame: CGRectMake(0, 0, 320, 568))
    view.backgroundColor = UIColor.redColor()
    controller.view = view

    var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
    label.center = CGPointMake(160, 284)
    label.textAlignment = NSTextAlignment.Center
    label.text = "Hello World"
    controller.view.addSubview(label)

    self.window!.rootViewController = controller
    self.window!.makeKeyAndVisible()
    return true
}

回答:


449

ビューコントローラにprefersStatusBarHiddenを実装する必要があります:

Swift 3以降

override var prefersStatusBarHidden: Bool {
    return true
}

4
Jayの意図は、完全なアプリのステータスバーを非表示にすることです。そのため、アプリケーションのdidFinishLaunchingWithOptionsに非表示機能を記述しました。完全なアプリのステータスバーを非表示にする方法は?
Satyam、2014

@Satyamには良い点があります。これをアプリケーション全体で削除するとよいでしょう。継承を通じてこれを実装するアプローチはありますか?またはプロトコル拡張を介して?
Dan Beaulieu

3
@DanBeaulieu継承を通じて素晴らしい解決策になると思います。非表示のバーがtrueに設定されているUIViewControllerサブクラスを作成し、すべてのサブクラスがそのサブクラスを継承するようにします。別のアプローチは、使用している可能性スウィズリング
crisisGriega

1
Swift 3のコードは機能しませんでした:stackoverflow.com/a/38902285/129202
Jonny

1
この方法には欠点があります。セグエを実行すると、現在のビューコントローラーの親ビューが約20ピクセル落ちます
iman kazemayni

99
  1. Info.plistファイルに移動します
  2. それらの行のいずれかにカーソルを合わせると、(+)および(-)ボタンが表示されます。
  3. プラスボタンをクリックして、大文字のVで始まる新しいキータイプを追加します。自動的に最初の選択肢は、コントローラーベースのステータスバーの外観を表示することです。
  4. それをKEYとして追加します。
  5. VALUEを「NO」に設定します
  6. あなたに行くAppDelegate.swift
  7. メソッド内にコードを追加します

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool {
        application.statusBarHidden = true
        return true
    }

できた!アプリを実行すると、ステータスバーがなくなります。


1
最初はこのソリューションは問題なく機能すると思っていましたが、CG_CONTEXT_SHOW_BACKTRACEでデバッグする必要があるエラーが発生することに気付きました。「ビューコントローラーベースのステータスバーの外観」の追加にバックトレース
Sean

IOS 9 2.2でうまく機能しました
uplearnedu.com

1
iOS 10.1シミュレータで動作しました。ありがとう、@ nycdanie。
ジェローム

7
「コントローラーベースのステータスバーの外観を表示する」を「いいえ」に設定するだけでなく、「ステータスバーは最初は非表示」を「はい」に設定して追加します。これで、ビューコントローラにコードを追加する必要がなくなり、ステータスバーがアプリケーション全体で非表示になります。Xcode 8.1、Swift 3.0.1、iOS 10
tylerSF

1
@tylerSF素晴らしい作品!あなたは答えとしてこれを追加する必要があります:)
PéturIngi Egilsson

72

スウィフト3

Info.plistセットView controller-based status bar appearanceしますNO

そして電話する UIApplication.shared.isStatusBarHidden = true


1
yesに設定されている場合、これが機能する唯一の方法です。
farzadshbfn 2016年

@farzadshbfn不正解です。私が言及してテストしたように、ブール値のNOでも機能します。
Codetard 2017

43

スライドインメニューポップアップなどを表示したり閉じたりするときに、ボタンタップでステータスバーを非表示にして戻す場合は、次の方法を使用できます。

ステータスバーを非表示にするには:-

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

ステータスバーを元に戻すには:-

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 

これはもっとハックです。私はこのようなウィンドウをいじくりたくありません...特にソリューションが既に存在する場合は。prefersStatusBarHiddenすでに述べたように、開発者にこのプロパティをオーバーライドすることをお勧めします。
スティーブンポール

2
これは、ステータスバーを一時的に非表示にして戻す場合に使用できます。私のアプリで、スライダーメニューが左側から来たときに、ステータスバーを非表示にします。メニューが消えたら、GmailのiOSアプリのようにステータスバーを元に戻す必要があります。そのようなシナリオでは、これを使用できます。
Vincent Joy

3
それはハックであり、私はそれに干渉しないでしょうが、それ今のところ機能します。皆さんが言うように。の問題prefersStatusBarHiddenは、制約を使用してステータスバーに関連付けられているビュー、およびナビゲーションバーも、を使用してステータスバーのオン/オフを切り替えると不適切に移動することですprefersStatusBarHidden 。現時点では、この回答のみがそれを回避するようです。
ジョニー

@Jonnyに完全に同意しprefersStatusBarHiddenます。このソリューションも好きではありませんが、彼が言ったように、オーバーライドすると制約が混乱します。これまでのところ、これでうまくいきます。ただし、シングルトンの使用を避けるために小さなラッパーを使用しています。ここで
rgkobashi

34

コーディングではなく視覚的なアプローチを好む場合は、この方法を使用します。 info.plist

ここに画像の説明を入力してください 単に追加View controller-based status bar appearanceするNO

そして、Status bar is initially hiddenなどYES


これは2018年の標準的な回答です
ChrisH

28
 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true);
    navigationController?.navigationBar.hidden = true // for navigation bar hide
    UIApplication.sharedApplication().statusBarHidden=true; // for status bar hide
}

28

iOS 10 / Swift 3.0のアップデート

関数ではなく、プロパティ...

override var prefersStatusBarHidden: Bool {
    return true
}

アプリ全体でこれを設定する方法を知っていますか?現在、これを各viewControllerに入力する必要があります
William T.

[検索]メニューを試してから、プロジェクトで検索して置換しますか?たぶん?しかし、それはネストされたgetで余分な括弧をくわえています...うーん……。良い質問!
atlwx

prefersStatusBarHiddenが呼び出されることはありません
Bagusflyer

6
あなたがget { }持っていない場合は必要ありませんset、ただ書いてくださいreturn true
Daniel



12

したがって、ここでの問題は実際にはSwiftとは関係ありませんが、iOS 7でのステータスバーの外観の処理方法だけです。

デフォルトでは、ビューコントローラは、画面上にあるときのステータスバーの外観を個別に制御します。このメソッドを使用してステータスバーを制御する場合は、外観を変更するビューコントローラーの次のメソッドをオーバーライドできます。

prefersStatusBarHiddenpreferredStatusBarStylepreferredStatusBarAnimation

あなたの場合、実装prefersStatusBarHiddenして返すだけですtrueです。

もう1つの方法は、アプリケーションレベルでステータスバーの外観を制御することです。これはあなたが実際にしようとしていることのようです(設定することでapplication.statusBarHidden)。

これを機能させるには、アプリのInfo.plistファイルを開いてキーを追加UIViewControllerBasedStatusBarAppearanceし、の値を指定する必要がありますNO


1
つまり、prefersStatusBarHiddenに対してtrue返すということですNOはObjCに属し、とにかく間違ったブール値です。
HenryRootTwo 2014

.plistファイルにない@HenryRootTwo。そこではまだYES / NOを使用しています
Alex Salom

8

私は実際にこれを理解しました。ソリューションを別のオプションとして追加します。

extension UIViewController {
    func prefersStatusBarHidden() -> Bool {
        return true
    }
}

物事をクリーンでモジュール化しておくための素晴らしいアプローチ
Roger Fernandez Guri 2014

2
これは実装できません。多分それは今私がSwift 1.2を使用しているためです。「メソッド 'prefersStatusBarHidden()'とObjective-Cセレクター 'prefersStatusBarHidden'が同じObjective-Cセレクターでの以前の宣言と競合しています」というエラーが発生します。最初にオーバーライドキーワードも追加しましたが、同じエラーが発生します。
Andrej

これをすべてのビューに追加する必要がありますか?
Sean

上記の@Andrejで説明したように、Swift 2では機能せず、エラーが表示されます。
Nagendra Rao 2016

4

iOSの9は方法の人々上記のいずれかのような、ここで言及しているサポートされていないので、わかりましたので、これは私のために問題になりますUIApplication.sharedApplication().statusBarHidden = true

UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)

そして

override func prefersStatusBarHidden() -> Bool {
     return true
}

動作しますが、条件に応じて変更できるプログラム可能なソリューションは提供されません。(statusBarHidden = truestatusBarHidden = false、私たちは前に行ったように)。

この狂気への解決策:

するために追加することによりprefersStatusBarHidden()、あなたがプログラムで追加することなく、ステータスバーの非表示と表示を制御することができます下に好きなUIViewControllerBasedStatusBarAppearanceあなたに設定をInfo.plistファイル

var showStatusBar = true

override func prefersStatusBarHidden() -> Bool {
     if showStatusBar {
         return false
     }
     return true
}

private func showStatusBar(enabled: Bool) {
    showStatusBar = enabled
    prefersStatusBarHidden()
}

次に、コード全体で次のように使用します。

//Hide Status Bar
showStatusBar(false)

または

//Show Status Bar
showStatusBar(true)

1
ないprefersStatusBarHidden任意の意味をなさない呼び出しますか?割り当てself.setNeedsStatusBarAppearanceUpdate()後のshowStatusBarことだと思います
レオ

本当に狂気ですね。これはなんと哀れなAPIであり、長い間使用されてきました。このようなことは、iOSの開発を時々信じられないほど苛立たせます。
Womble 2016

@Womble、はい、それもかなり複雑になる可能性があります。うまくいけば、Swift 3.0の方がライブラリが優れており、一見するとサポートされるようになりました。Swift2.3から大きく変わっています...
CodeOverRide 2016

メソッドからprefersStatusBarHiddenを呼び出す代わりに、setNeedsStatusBarAppearanceUpdate
Oscar

4

追加するだけで、prefersStatusBarHiddenメソッドまたは変数をオーバーライドする場合View controller-based status bar appearance、Info.plistの値はYESでなければなりません。そうでない場合、オーバーライドは効果がありません。


4

Swift 4.2では、現在はプロパティです。

override var prefersStatusBarHidden: Bool {
    return true
}

3

私の場合、オンデマンドで非表示/表示するステータスバーを探していました。ビューがロードまたは非表示になるときだけではなく。

Swift 3.x

//show status bar initially
var showStatusBar = true

//set the parameters
override var prefersStatusBarHidden: Bool {

    if showStatusBar == true {

        //does not prefer status bar hidden
        print("does not prefer status bar hidden")
        return false

    } else {

        //does prefer status bar hidden
        print("does prefer status bar hidden")
    return true

    }
}

//ex: hide status bar and call parameter function again whenever you want
        showStatusBar = false
        setNeedsStatusBarAppearanceUpdate()

3

Swift 5:メインビューコントローラー、またはメインナビゲーションコントローラー(ある場合)

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

そして、plistの「View controller-based status bar appear」はYESでなければなりません。そうでない場合、上記のコードは呼び出されません。

アプリの起動時にステータスバーを非表示にする場合は、plistの「ステータスバーは最初は非表示」がYESである必要があります。これにより、画面上部に余分な青いバーが表示されたときに起動画像が歪むのを防ぐことができます。


2

私にとって有効な解決策。ロード中に特定のビューコントローラのステータスバーを非表示にする場合:

import UIKit

class ViewController: UIViewController {

private var hideStatusBar: Bool = false

override var prefersStatusBarHidden: Bool {
    return hideStatusBar
}

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    return UIStatusBarAnimation.slide
}

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundcolor = .white
    hideStatusBar = true

    UIView.animate(withDuration: 0.3) {
        self.setNeedsStatusBarAppearanceUpdate()
    }
}

注意:info.plistでキー「ビューコントローラベースのステータスバーの外観」を「いいえ」に設定した場合、上記のコードは機能しません。キーを " YES "に設定するか、info.plistから削除してください


格納されたプロパティであるため、hideStatusBarプロパティをオーバーライドすることはできません。ただし、別の名前を選択するだけで、アニメーションは機能します。
XcodeNOOB 2018

2

プロジェクトの[全般]-> [展開情報]-> [ステータスバースタイル]で、[ステータスバーを非表示]のチェックマークを選択します。注:-アプリケーション全体でステータスバーを非表示にします。


1
これは私(ios 12)で機能しますが、plistの回答では機能しません。
threeve

2

Swift 4+の場合、次のコードを試してください(Swift 4.0、4.1-IOS 10、11でテスト済み):

override var prefersStatusBarHidden: Bool { return true }

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // call this func to force preferredStatusBarStyle to be read again.
    setNeedsStatusBarAppearanceUpdate()
}

2

Swift 5+

私の場合、いくつかの条件に基づいて非表示になっているステータスバーを更新する必要があります。

このため、BaseViewController新しいプロパティを含む基本コントローラーを作成しますhideStatusBar

他のビューコントローラーは、この基本コントローラーのサブクラスです。最後に、ステータスバーの動作を更新する場合、このhideStatusBar値を変更するだけで済みます。

class BaseViewController: UIViewController {

    var hideStatusBar: Bool = false {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var prefersStatusBarHidden: Bool {
           return hideStatusBar
    }
}

使い方

final class ViewController: BaseViewController, UIScrollViewDelegate {
    let scrollView = UIScrollView()

    ...

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 100 {
                self.hideStatusBar = true
            } else {
                self.hideStatusBar = false
            }
        }
    }
}

デモ

これがデモですUIView.animate(...)。トランジションをスムーズにするために使用しています。

ここに画像の説明を入力してください


1

Xcode 8.1(8B62)を使用していて、デプロイメントターゲットを10.1に設定していて、上記のオーバーライドオプションでうまくいきませんでした。ただし、展開情報の[ステータスバーを非表示にする]オプションをオンにするとうまくいきました。

プロジェクト>一般

これがお役に立てば幸いです。


1

ビューコントローラーをモーダルで表示している場合は、

viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true

0
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        application.isStatusBarHidden = true
        return true
    }

4
質問に答えるときは、答えを説明してください。コードスニペットは適切な答えではありません。
LazerBanana 2017


0

プロジェクト->一般->展開情報

ステータスバーのスタイル:-

ステータスバーを非表示にする(iOS 10)


0

スウィフト4

//MARK:- Show Status Bar
UIApplication.shared.isStatusBarHidden = false

//MARK:- Hide Status Bar
UIApplication.shared.isStatusBarHidden = true

さて、今のところiOS 12はありません。11.4の場合は更新時にも修正します。また、teamviewerがある場合は、システムで修正します
Shakeel Ahmed

廃止予定
Vyachaslav Gerchicov

0

iOS 13およびSwift 5用に更新

上記の答えのどれもうまくいかない場合。これがあるかどうかをplistで確認してください:

「コントローラーベースのステータスバーの外観を見る」

その場合は、必ずYESに設定してください!!!!!

その後、次のコードが機能します。

override var prefersStatusBarHidden: Bool {
    return true
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.