Я хочу удалить строку состояния в верхней части экрана.
Это не работает:
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
}
Вы действительно должны реализовать prefersStatusBarHidden на своих контроллерах представления:
Свифт 2
override func prefersStatusBarHidden() -> Bool {
return true
}
Свифт 3 и позже
override var prefersStatusBarHidden: Bool {
return true
}
Добавьте код внутри метода
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool {
application.statusBarHidden = true
return true
}
СДЕЛАНО! Запустите приложение и не увидите строку состояния!
Swift 3
В Info.plist
установите View controller-based status bar appearance
в NO
И вызовите UIApplication.shared.isStatusBarHidden = true
Если вы хотите скрыть и вернуть строку состояния при нажатии кнопки, в то время как во время представления и закрытия слайд-меню, всплывающих окон и т.д., То вы можете использовать этот метод: -
Чтобы скрыть строку состояния: -
UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar
Чтобы вернуть строку состояния: -
UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal
prefersStatusBarHidden
как уже упоминалось.
если вы предпочитаете визуальный подход, а не его кодирование, используйте этот метод:
в info.plist
просто добавьте View controller-based status bar appearance
в NO
и Status bar is initially hidden
как YES
Обновление для iOS 10/Swift 3.0
Больше не функция, теперь свойство...
override var prefersStatusBarHidden: Bool {
return true
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(true);
navigationController?.navigationBar.hidden = true // for navigation bar hide
UIApplication.sharedApplication().statusBarHidden=true; // for status bar hide
}
в Swift 3.x:
override func viewWillAppear(_ animated: Bool) {
UIApplication.shared.isStatusBarHidden = true
}
Таким образом, проблема здесь не имеет ничего общего с Swift, но как выглядит состояние строки с iOS 7.
По умолчанию контроллеры просмотра индивидуально управляют появлением строки состояния, когда они находятся на экране. Если вы хотите использовать этот метод управления статусной строкой, вы можете переопределить следующие методы для любых контроллеров представлений, которые вы хотите изменить внешний вид:
prefersStatusBarHidden
preferredStatusBarStyle
preferredStatusBarAnimation
,
В вашем случае вы просто реализуете prefersStatusBarHidden
и возвращаете true
.
Другим способом было бы управлять появлением строки состояния на уровне приложения. Кажется, это то, что вы на самом деле пытаетесь сделать (установив application.statusBarHidden
).
Чтобы выполнить эту работу, вам нужно открыть файл приложения Info.plist
и добавить ключ UIViewControllerBasedStatusBarAppearance
и присвоить ему значение NO
.
Перейдите в ваш Info.plist и добавьте два ключа:
Я сам это понял. Я добавлю свое решение в качестве другого варианта.
extension UIViewController {
func prefersStatusBarHidden() -> Bool {
return true
}
}
Хорошо, так что это становится проблемой для меня, поскольку iOS 9 не поддерживает какой-либо метод, упомянутый здесь, например UIApplication.sharedApplication().statusBarHidden = true
или
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)
и
override func prefersStatusBarHidden() -> Bool {
return true
}
работает, но не предоставляет программируемого решения, где я могу изменить состояние.
(statusBarHidden = true
и statusBarHidden = 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)
prefersStatusBarHidden
либо смысл вызов prefersStatusBarHidden
? Я предполагаю, что вы имеете в виду self.setNeedsStatusBarAppearanceUpdate()
после присвоения showStatusBar
В моем случае я искал строку состояния, чтобы скрывать/показывать по требованию; а не только когда изображение загружается или исчезает.
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()
Просто добавьте, переопределяя метод или переменную prefersStatusBarHidden
, View controller-based status bar appearance
в Info.plist должен быть ДА, иначе переопределение не будет иметь эффекта
Swift 4
//MARK:- Show Status Bar
UIApplication.shared.isStatusBarHidden = false
//MARK:- Hide Status Bar
UIApplication.shared.isStatusBarHidden = true
Решение, которое работает для меня; если вы хотите скрыть строку состояния на определенном контроллере представления во время загрузки:
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()
}
}
Внимание: если вы установили ключ "Просмотр внешнего вида строки состояния на основе контроллера" на "NO" в вашем info.plist, приведенный выше код не будет работать. Вы должны установить ключ на "ДА" или удалить его из info.plist
Для 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()
}
в Swift 4.2 это свойство сейчас.
override var prefersStatusBarHidden: Bool {
return true
}
Поздний ответ, но если вам нужно альтернативное решение, вы можете использовать это:
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
}
}
В вашем проекте General-> Развертывание Info-> Стиль строки состояния установите флажок Скрыть строку состояния. Примечание: - она скрывает строку состояния во всем приложении
В разделе Project- > General- > Deployment info
Стиль панели состояния: -
только что отмеченная Скрыть панель состояния (iOS 10)
Этот код можно использовать в ViewController
Class
scope
open override var prefersStatusBarHidden: Bool { return true }
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.isStatusBarHidden = true
return true
}
Я использую Xcode 8.1 (8B62) с целевым значением развертывания, установленным в 10.1, и мне не повезло с вышеперечисленными опциями переопределения. Однако проверка опции "Скрыть строку состояния" в "Сведения о развертывании" сделала для меня трюк.
Надеюсь, это поможет.
self.navigationController?.isNavigationBarHidden = true