Как скрыть строку состояния в приложении Swift для iOS?

175

Я хочу удалить строку состояния в верхней части экрана.

Это не работает:

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
}
Теги:
iphone
ios7

25 ответов

392
Лучший ответ

Вы действительно должны реализовать prefersStatusBarHidden на своих контроллерах представления:

Свифт 2

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

Свифт 3 и позже

override var prefersStatusBarHidden: Bool {
    return true
}
  • 4
    Я думаю, что намерение Джея состоит в том, чтобы скрыть строку состояния для полного приложения. Вот почему он написал бы функцию скрытия в приложении didFinishLaunchingWithOptions. Как скрыть строку состояния для полного приложения?
  • 0
    @Satyam имеет хорошее замечание, было бы неплохо удалить это во всем приложении. Есть ли подход для реализации этого через наследование? Или через расширение протокола?
Показать ещё 4 комментария
99
  • Перейти в файл Info.plist
  • Наведите курсор на одну из этих строк и появится кнопка (+) и (-).
  • Нажмите кнопку "плюс", чтобы добавить новый ключ "Тип", начинающийся с капитала V, и автоматически первым выбором будет просмотр состояния строки на основе контроллера.
  • Добавьте это как КЛЮЧ.
  • Установите для VALUE значение "НЕТ"
  • Перейти к вам AppDelegate.swift
  • Добавьте код внутри метода

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

СДЕЛАНО! Запустите приложение и не увидите строку состояния!

  • 0
    Сначала я думал, что это решение работает нормально, но потом я заметил, что оно вызывает ошибку, которую мне нужно было отладить с помощью CG_CONTEXT_SHOW_BACKTRACE. Возвратил это к добавлению «Просмотр внешнего вида строки состояния на основе контроллера»
  • 0
    Кажется, это не работает в iOS 9 Swift 2.2
Показать ещё 9 комментариев
65

Swift 3

В Info.plist установите View controller-based status bar appearance в NO

И вызовите UIApplication.shared.isStatusBarHidden = true

  • 1
    Если установлено значение yes, это единственный способ, которым это будет работать.
  • 0
    @farzadshbfn это не правильно. Как уже упоминалось и проверено мной, он работает с логическим NO.
33

Если вы хотите скрыть и вернуть строку состояния при нажатии кнопки, в то время как во время представления и закрытия слайд-меню, всплывающих окон и т.д., То вы можете использовать этот метод: -

Чтобы скрыть строку состояния: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

Чтобы вернуть строку состояния: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 
  • 0
    спасибо большое =)
  • 0
    Это больше взломать. Я бы не хотел вмешиваться в это окно ... особенно, если решение уже существует. Я бы посоветовал разработчикам переопределить свойство prefersStatusBarHidden как уже упоминалось.
Показать ещё 4 комментария
30

если вы предпочитаете визуальный подход, а не его кодирование, используйте этот метод: в info.plist

Изображение 1810 просто добавьте View controller-based status bar appearance в NO

и Status bar is initially hidden как YES

  • 0
    Это канонический ответ в 2018 году
  • 0
    работает на Swift 4.2 и iOS 12.2
27

Обновление для iOS 10/Swift 3.0

Больше не функция, теперь свойство...

override var prefersStatusBarHidden: Bool {
    return true
}
  • 0
    Вы знаете, как установить это во всем приложении, в настоящее время я должен ввести это в каждый viewController
  • 0
    Попробуйте найти меню, затем найти и заменить в проекте? Может быть? Но эта чертова дополнительная скобка с вложенным get ... хммм ... не знаю. хороший вопрос!
Показать ещё 2 комментария
26
 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true);
    navigationController?.navigationBar.hidden = true // for navigation bar hide
    UIApplication.sharedApplication().statusBarHidden=true; // for status bar hide
}
14

в Swift 3.x:

override func viewWillAppear(_ animated: Bool) {
    UIApplication.shared.isStatusBarHidden = true
}
  • 0
    Да, работает на Swift 3+.
12

Таким образом, проблема здесь не имеет ничего общего с Swift, но как выглядит состояние строки с iOS 7.

По умолчанию контроллеры просмотра индивидуально управляют появлением строки состояния, когда они находятся на экране. Если вы хотите использовать этот метод управления статусной строкой, вы можете переопределить следующие методы для любых контроллеров представлений, которые вы хотите изменить внешний вид:

prefersStatusBarHidden preferredStatusBarStyle preferredStatusBarAnimation,

В вашем случае вы просто реализуете prefersStatusBarHidden и возвращаете true.

Другим способом было бы управлять появлением строки состояния на уровне приложения. Кажется, это то, что вы на самом деле пытаетесь сделать (установив application.statusBarHidden).

Чтобы выполнить эту работу, вам нужно открыть файл приложения Info.plist и добавить ключ UIViewControllerBasedStatusBarAppearance и присвоить ему значение NO.

  • 1
    Я думаю, что вы имеете в виду вернуть true для prefersStatusBarHidden. NO принадлежит ObjC и в любом случае является неправильным значением bool.
  • 0
    @HenryRootTwo не в файлах .plist. Там мы все еще используем ДА / НЕТ
11

Перейдите в ваш Info.plist и добавьте два ключа:

Изображение 1811

8

Я сам это понял. Я добавлю свое решение в качестве другого варианта.

extension UIViewController {
    func prefersStatusBarHidden() -> Bool {
        return true
    }
}
  • 0
    Хороший подход к чистоте и модульности
  • 2
    Я не могу это реализовать. Может быть, это потому, что сейчас я использую Swift 1.2. Я получаю сообщение об ошибке: «Метод» prefersStatusBarHidden () с селектором Objective-C «prefersStatusBarHidden» конфликтует с предыдущим объявлением с тем же селектором Objective-C ». Я также добавил ключевое слово override в начале, но все равно получаю ту же ошибку.
Показать ещё 3 комментария
4

Хорошо, так что это становится проблемой для меня, поскольку 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)
  • 0
    Имеет ли prefersStatusBarHidden либо смысл вызов prefersStatusBarHidden ? Я предполагаю, что вы имеете в виду self.setNeedsStatusBarAppearanceUpdate() после присвоения showStatusBar
  • 0
    Это действительно безумие, не так ли? Какой это жалкий API, и так долго. Подобные вещи время от времени делают разработку iOS невероятно разочаровывающей.
Показать ещё 2 комментария
2

В моем случае я искал строку состояния, чтобы скрывать/показывать по требованию; а не только когда изображение загружается или исчезает.

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()
2

Просто добавьте, переопределяя метод или переменную prefersStatusBarHidden, View controller-based status bar appearance в Info.plist должен быть ДА, иначе переопределение не будет иметь эффекта

1

Swift 4

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

//MARK:- Hide Status Bar
UIApplication.shared.isStatusBarHidden = true
  • 0
    это не работает для меня
  • 0
    работает, проверено на iOS 12, хотя оно и удалено ...
Показать ещё 1 комментарий
1

Решение, которое работает для меня; если вы хотите скрыть строку состояния на определенном контроллере представления во время загрузки:

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

  • 0
    Вы не можете переопределить свойство hideStatusBar, так как это сохраненное свойство! однако вы можете просто выбрать другое имя, и ваша анимация будет работать.
0

Для 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()
}
0

в Swift 4.2 это свойство сейчас.

override var prefersStatusBarHidden: Bool {
    return true
}
0

Поздний ответ, но если вам нужно альтернативное решение, вы можете использовать это:

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
    }
}
0

В вашем проекте General-> Развертывание Info-> Стиль строки состояния установите флажок Скрыть строку состояния. Примечание: - она скрывает строку состояния во всем приложении

  • 0
    Это работает для меня (IOS 12), где plist ответов нет.
0

В разделе Project- > General- > Deployment info

Стиль панели состояния: -

только что отмеченная Скрыть панель состояния (iOS 10)

  • 0
    Звучит хорошо, не работает.
0

Этот код можно использовать в ViewController Class scope

open override var prefersStatusBarHidden: Bool { return true }
  • 0
    Спасибо за ответ, не могли бы вы рассказать подробнее? Где именно он должен добавить строку кода и почему это будет работать? Смотрите раздел Как написать хороший ответ .
0
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        application.isStatusBarHidden = true
        return true
    }
  • 2
    При ответе на вопрос, пожалуйста, объясните свой ответ, фрагмент кода не является правильным ответом.
0

Я использую Xcode 8.1 (8B62) с целевым значением развертывания, установленным в 10.1, и мне не повезло с вышеперечисленными опциями переопределения. Однако проверка опции "Скрыть строку состояния" в "Сведения о развертывании" сделала для меня трюк.

Проект > Общие сведения

Надеюсь, это поможет.

-1
self.navigationController?.isNavigationBarHidden = true

Ещё вопросы

Сообщество Overcoder
Наверх
Меню