Скрыть строку состояния swift 4

Я пытаюсь скрыть строку состояния в одном из моих UIViewControllers (Swift 4).

  • Во-первых, я устанавливаю Просмотр состояния строки на основе контроллера на ДА в Info.plist.

  • Я переопределил свойство prefersStatusBarHidden в моем контроллере:


override var prefersStatusBarHidden: Bool {
     return true
}

  • И в viewDidLoad() я добавил функцию setNeedsStatusBarAppearanceUpdate(), чтобы заставить свойство prefersStatusBarHidden читать.

После всего этого я все еще вижу строку состояния на UIViewController.

Может кто-нибудь мне помочь, пожалуйста?

Ответ 1

Вероятно, вы уже нашли свое собственное решение, но я получил его так:

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
}

Ответ 2

Вы можете скрыть строку состояния в любом или всех ваших контроллерах представлений, просто добавив этот код:

override var prefersStatusBarHidden: Bool {
     return true
   }

Любой контроллер просмотра, содержащий этот код, по умолчанию будет скрывать строку состояния.

Если вы хотите анимировать строку состояния в или из нее, просто вызовите setNeedsStatusBarAppearanceUpdate() на свой контроллер представлений - это заставит prefersStatusBarHidden читать снова, на котором вы можете вернуть другое значение. Если вы хотите, ваш вызов setNeedsStatusBarAppearanceUpdate() может фактически находиться внутри блока анимации, что приводит к тому, что строка состояния скрывается или отображается плавно.

Ответ 3

Если вы представляете контроллер представления по модулю, попробуйте

viewController.modalPresentationCapturesStatusBarAppearance = true

Ответ 4

Хотя некоторые реализации более чистые, такие как:

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
}

Попробуйте, отлично работает для меня.

Ответ 5

Попробуйте установить флажок "Просмотр состояния панели управления на основе контроллера" в Info.plist на "YES". Это заставит приложение вызвать свойство prefersStatusBarHidden: Bool на каждом контроллере представления.

Просмотреть флаг состояния строки состояния на основе контроллера

Ответ 6

Используйте следующий код UIApplication.shared.isStatusBarHidden = true

Это единственное, что я обнаружил в iOS11. вы можете написать в didFinishLaunchingWithOptions или в 'viewWillAppear' из вас BaseViewController Наслаждайтесь.

Ответ 7

Как вы сказали, вы используете UINavigationController для перехода к своему настраиваемому контроллеру представлений. Я полагаю, вы установили свой контроллер пользовательского вида в качестве корневого представления вашего UINavigationController. В этом случае переопределение var prefersStatusBarHidden в вашем настраиваемом контроллере просмотра не будет работать, но вам придется подклассифицировать ваш контроллер UINavigation и переопределить свойство там, как показано ниже:

class CustomNavigationController: UINavigationController {

    override var prefersStatusBarHidden: Bool {
        return true
    }

}

Ответ 8

Когда вы пытаетесь перегрузить свойства строки состояния для ViewController, который в UINavigationStack - вам нужно сделать расширение ниже

extension UINavigationController {
  override open var childForStatusBarStyle: UIViewController? {
    return self.topViewController
  }
}

тогда ваши перегруженные свойства станут активными

Ответ 9

Попробуйте проверить Скрыть строку состояния в разделе Общие параметров вашего проекта.

Скрыть строку состояния в разделе

Ответ 10

Ни один из них не работал у меня, работая над преобразованным проектом в iOS 11. Вот что я сделал. Я добавил этот код в AppDelegate

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

Ответ 11

Просто измените ограничение "Top Space to" на ваш вид из Безопасной области в Superview. И он будет перетаскивать ваш вид под строкой состояния, поэтому его не нужно будет скрывать ![enter image description here] 1

Ответ 12

Я обнаружил, что prefersStatusBarHidden не вызывался в моем контроллере представления, потому что я использовал настраиваемое представление контейнера, и мне нужно было переслать строку состояния, скрывающую ответственность, в дочерний контроллер представления. Реализация var childForStatusBarHidden: UIViewController? { return childViewController } var childForStatusBarHidden: UIViewController? { return childViewController } в контроллере представления контейнера, если для меня.

Ответ 13

Необходимо написать код в контроллере представления контейнера, если это дочерний контроллер представления

     override var prefersStatusBarHidden: Bool {
      return true
     }

Ответ 14

Добавьте это в ваш info.plist

<key>UIStatusBarHidden</key>
    <true/>

Ответ 15

Я искал это, и одна работа для меня -

Swift 5

override var prefersStatusBarHidden: Bool {
  return true
 }

Ответ 16

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView{
       statusBar.isHidden = true
    }
}