Как скрыть строку состояния одного контроллера представления в iOS 9?
В ViewController, который я представил модально, я сделал это:
override func prefersStatusBarHidden() -> Bool {
return true
}
Это работало, но оно больше не работает. Какой лучший способ скрыть строку состояния только для этого контроллера представления?
Ответы
Ответ 1
Для Swift 3 и Swift 4 это изменилось на переопределение переменной как это:
override var prefersStatusBarHidden: Bool {
return true
}
Если вы хотите "обновить" состояние, когда контроллер представления уже отображается, вам необходимо вызвать:
setNeedsStatusBarAppearanceUpdate()
Пожалуйста, обратитесь к документации.
Ответ 2
Для Swift 3 и Swift 4.2, когда вид собирается появиться
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIApplication.shared.isStatusBarHidden = true
}
когда посмотреть goint в Dissapear
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.shared.isStatusBarHidden = false
}
Возможно, вам нужно установить его в вашем info.plist, следующую строку:
View controller-based status bar appearance = NO
![enter image description here]()
Ответ 3
В iOS 9, Xcode 7, Swift 2.0 он возвращается к тому, как это было ранее.
override func prefersStatusBarHidden() -> Bool {
return true
}
Фактически Xcode скажет вам, что
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None)
устарел и что вы должны использовать метод prefersStatusBarHidden.
Ответ 4
В вашем UIViewController:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
UIApplication.shared.isStatusBarHidden = true
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
//It will show the status bar again after dismiss
UIApplication.shared.isStatusBarHidden = false
}
override var prefersStatusBarHidden: Bool {
return true
}
Ответ 5
Для Swift 3,
override var prefersStatusBarHidden: Bool{
return true
}
и добавьте viewDidLoad()
self.modalPresentationCapturesStatusBarAppearance = true
Ответ 6
Вы можете добиться этого, просто переопределив свойство prefersStatusBarHidden
в вашем ViewController, как показано ниже:
override var prefersStatusBarHidden: Bool {
return true
}
![Screenshot added]()
Это работает для Swift 3/4.
Ответ 7
Для тех, кто все еще борется, ниже работает для iOS9.
Вы обновляете функцию root preferController prefersStatusBarHidden, вызывая ее из вашего отдельного просмотра/просмотра внуков/внуков. Это работает там, где вы добавляете childViewControllers прямо в ваш rootViewController.
Вам не нужно ничего устанавливать в файле info.plist, но установка параметра 'statusBarIsInitiallyHidden' работает независимо от ниже.
Сначала в корневом контроллере root добавьте следующее:
-(void)viewDidLoad {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateStatusBarAppearance:) name:@"kStatusBarAppearance" object:nil];
}
-(void)updateStatusBarAppearance:(NSNotification *)n {
statusBarIsHidden = [n.object boolValue];
[self setNeedsStatusBarAppearanceUpdate];
}
-(UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent; //optional
}
-(BOOL)prefersStatusBarHidden{
return statusBarIsHidden;
}
Затем в одном контроллере представления, где вы хотите скрыть строку состояния, вызовите это:
-(void)viewDidLoad {
[[NSNotificationCenter defaultCenter] postNotificationName:@"kStatusBarAppearance" object:[NSNumber numberWithBool:true]];
}
-(void)popSelf {
[[NSNotificationCenter defaultCenter] postNotificationName:@"kStatusBarAppearance" object:[NSNumber numberWithBool:false]];
}
Ответ 8
Вы можете использовать
override public func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
// hide status bar
dispatch_async(dispatch_get_main_queue(), {
if let window = UIApplication.sharedApplication().keyWindow {
window.windowLevel = UIWindowLevelStatusBar + 1
}
})
}
override public func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
// Show status bar
dispatch_async(dispatch_get_main_queue(), {
if let window = UIApplication.sharedApplication().keyWindow {
window.windowLevel = UIWindowLevelNormal
}
})
}
Ответ 9
Используйте этот код:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIApplication.shared.isStatusBarHidden = true
}
если этот код не работает, вам нужно добавить этот ключ в файл info.plist
Просмотр состояния строки состояния контроллера - NO
Ответ 10
Полное решение для iOS 11 и Swift 4, предоставляющее вам полный контроль над вашей программой.
var statusBarHidden : Bool?
override var prefersStatusBarHidden: Bool {
get {
if let status = statusBarHidden { return status } else { return false }
}
set(status) {
statusBarHidden = status
setNeedsStatusBarAppearanceUpdate()
}
}
Теперь вы можете просто показать или скрыть строку состояния, установив свойство из своего кода. Я проверил это так:
@IBAction func Show(_ sender: Any) {
prefersStatusBarHidden = false
}
@IBAction func Hide(_ sender: Any) {
prefersStatusBarHidden = true
}
Работает как шарм.
Ответ 11
Я использую Xcode Version 9.2/Swift 3.2/iOS 11
Я получил этот ответ от BADCloud, хотя я не уверен, почему он не работает для него.
Во всяком случае, это работает для меня для конкретного контроллера представления.
Разница между этим ответом и другими ответами здесь заключается в том, что в моем info.plist
когда у меня изначально был вид строки состояния View на основе контроллера - НЕТ с двумя методами statusBar ниже, он не работал, но когда я изменил его на Да, работал с ними обоими.
В изменении info.plist
: просмотреть внешний вид строки состояния на основе контроллера - ДА ![enter image description here]()
В контроллере представления вы хотите, чтобы это изменилось в добавлении:
override func viewDidLoad() {
super.viewDidLoad()
// add this in ViewDidLoad
setNeedsStatusBarAppearanceUpdate()
}
// add this underneath ViewDidLoad
override var prefersStatusBarHidden: Bool {
return true
}
Ответ 12
Когда все остальное терпит неудачу (как это сделало для меня)
Редактирование.plist не требуется. И AppStore одобрит это
(UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow)?.isHidden = false
Ответ 13
Скройте панель состояния плавно, просто используя UIAnimation и сохраненное свойство.
Свифт 3+
var statusBarState = false
override var prefersStatusBarHidden: Bool{
return statusBarState
}
А потом в поле зрения WillAppear
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
statusBarState = true
UIView.animate(withDuration: 0.30) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
![enter image description here]()
Ответ 14
Поздний ответ, но если вам нужно альтернативное решение, вы можете использовать это:
public func ShowStatusBar() {
let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow
UIView.animate(withDuration: 0.3) {
statusBarWindow?.alpha = 1
}
}
public func HideStatusBar() {
let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow
UIView.animate(withDuration: 0.3) {
statusBarWindow?.alpha = 0
}
}
Ответ 15
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None)
и когда вы хотите вернуть его в отдельный VC:
UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: .None)