UIViewControllers(Swift 4)の1つでステータスバーを非表示にしようとしています。
まず、View Controllerベースのステータスバーの外観を[〜#〜] yes [〜#〜] in _Info.plist
_に設定します。
コントローラーのprefersStatusBarHidden
プロパティをオーバーライドしました:
_override var prefersStatusBarHidden: Bool {
return true
}
_
viewDidLoad()
には、prefersStatusBarHidden
プロパティを強制的に読み取るsetNeedsStatusBarAppearanceUpdate()
関数を追加しました。その後、UIViewController
にステータスバーが表示されます。
誰か助けてくれませんか?
あなたはおそらくこれに対するあなた自身の解決策をすでに見つけましたが、私はこの方法でそれを得ました:
override func viewWillAppear(_ animated: Bool) {
// Sets the status bar to hidden when the view has finished appearing
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
statusBar.isHidden = true
}
override func viewWillDisappear(_ animated: Bool) {
// Sets the status bar to visible when the view is about to disappear
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
statusBar.isHidden = false
}
次のコードを追加するだけで、View Controllerの一部またはすべてのステータスバーを非表示にできます。
override var prefersStatusBarHidden: Bool {
return true
}
そのコードを含むView Controllerは、デフォルトでステータスバーを非表示にします。
ステータスバーをインまたはアウトでアニメーション化する場合は、View ControllerでsetNeedsStatusBarAppearanceUpdate()を呼び出すだけです(強制的にprefersStatusBarHiddenを再度読み取り、その時点で別の値を返すことができます。必要に応じて、setNeedsStatusBarAppearanceUpdate()への呼び出しを実際にアニメーションブロック内に置くことができます。これにより、ステータスバーがスムーズに表示または非表示になります。
一部の実装は次のようにクリーンですが:
UIApplication.shared.isStatusBarHidden = true
遷移中に奇妙なクリッピングアニメーションがいくつかあります。もっと冗長ですが、私は@MachTurtleのソリューションを好みます:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
if let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as? UIView{
statusBar.isHidden = true
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
statusBar.isHidden = false
}
それを試してみてください、私にとってはうまくいきます。
View Controllerをモーダルで表示している場合は、試してください
viewController.modalPresentationCapturesStatusBarAppearance = true
次のコードを使用してくださいUIApplication.shared.isStatusBarHidden = true
iOS11で動作していることがわかったのはこれだけです。 didFinishLaunchingWithOptions
または「viewWillAppear」でBaseViewController
をお楽しみください。
前に言ったように、UINavigationControllerを使用してカスタムView Controllerに移動しています。カスタムビューコントローラーをUINavigationControllerのルートビューとして設定していると思います。この場合、カスタムView Controllerでvar prefersStatusBarHiddenをオーバーライドしても機能しませんが、UINavigation Controllerをサブクラス化し、以下に示すようにそこでプロパティをオーバーライドする必要があります。
class CustomNavigationController: UINavigationController {
override var prefersStatusBarHidden: Bool {
return true
}
}
これをinfo.plistに追加します
<key>UIStatusBarHidden</key>
<true/>
カスタムコンテナービューを使用していたため、View ControllerでprefersStatusBarHidden
が呼び出されておらず、子ビューコントローラーに責任を隠すステータスバーを転送する必要があることがわかりました。 var childForStatusBarHidden: UIViewController? { return childViewController }
私の場合、コンテナビューコントローラで修正されました。
ビューの「Top Space to」制約をセーフエリアからスーパービューに変更するだけです。そして、ステータスバーの下にビューをドラッグして、それを隠す必要はありません] 1
コンテナビューコントローラが子ビューコントローラである場合、コンテナビューコントローラにコードを記述する必要があります
override var prefersStatusBarHidden: Bool {
return true
}
これらはどれも、iOS 11で変換されたプロジェクトに取り組んだこともありませんでした。このコードをAppDelegateに追加しました
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool
{
application.isIdleTimerDisabled = true
application.isStatusBarHidden = true
return true
}