Как скрыть строку состояния и панель навигации при нажатии устройства

Как скрыть строку состояния и панель навигации, когда я нажимаю на устройство, как фотографии в iphone? Я использовал

UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.Slide)

но это не работает

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

3 ответа

Решение

В Swift 4 и iOS 11, в соответствии с вашими потребностями, вы можете выбрать один из трех следующих фрагментов кода, чтобы решить вашу проблему.


# 1. С помощью UINavigationControllerhidesBarsOnTap свойство + UIViewControllerprefersStatusBarHidden а также preferredStatusBarUpdateAnimation свойства

Начиная с iOS 8, UINavigationController имеет hidesBarsOnTap имущество. hidesBarsOnTap имеет следующую декларацию:

var hidesBarsOnTap: Bool { get set }

Логическое значение, указывающее, разрешает ли контроллер навигации скрывать свои панели с помощью жеста касания.

Apple также заявляет о hidesBarsOnTap:

Когда значение этого свойства trueконтроллер навигации переключает скрытие и отображение своей панели навигации и панели инструментов в ответ на необработанное касание в области содержимого. Значение по умолчанию этого свойства false,

Следующий код показывает, как реализовать hidesBarsOnTap:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationController?.hidesBarsOnTap = true
    }

    override var prefersStatusBarHidden: Bool {
        return navigationController?.isNavigationBarHidden == true
    }

    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
        return UIStatusBarAnimation.slide
    }

}

# 2. С помощью UINavigationControllersetNavigationBarHidden(_:animated:) метод + UIViewControllerprefersStatusBarHidden а также preferredStatusBarUpdateAnimation свойства с UIButton

UINavigationController имеет метод, называемый setNavigationBarHidden(_:animated:), setNavigationBarHidden(_:animated:) имеет следующую декларацию:

func setNavigationBarHidden(_ hidden: Bool, animated: Bool)

Устанавливает, скрыта ли панель навигации.

Следующий код показывает, как переключать строку состояния и панель навигации с помощью setNavigationBarHidden(_:animated:) с UIButton установить в раскадровке и связан с @IBAction:

import UIKit

class ViewController: UIViewController {

    // Link this @IBAction to a `UIButton`
    @IBAction func toggle(_ sender: UIButton) {
        navigationController?.setNavigationBarHidden(navigationController?.isNavigationBarHidden == false, animated: true)
    }

    override var prefersStatusBarHidden: Bool {
        return navigationController?.isNavigationBarHidden == true
    }

    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
        return UIStatusBarAnimation.slide
    }

}

# 3. С помощью UINavigationControllersetNavigationBarHidden(_:animated:) метод + UIViewControllerprefersStatusBarHidden а также preferredStatusBarUpdateAnimation свойства с UIGestureRecognizer

В качестве альтернативы предыдущему коду вы можете использовать setNavigationBarHidden(_:animated:) с UIGestureRecognizer вместо UIButton:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let gesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.toggle))
        view.isUserInteractionEnabled = true
        view.addGestureRecognizer(gesture)
    }

    @objc func toggle() {
        navigationController?.setNavigationBarHidden(navigationController?.isNavigationBarHidden == false, animated: true)
    }

    override var prefersStatusBarHidden: Bool {
        return navigationController?.isNavigationBarHidden == true
    }

    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
        return UIStatusBarAnimation.slide
    }

}

Посмотрите этот ответ для аналогичного вопроса, если вам нужно ориентироваться на iOS 10.

На iOS 8 и выше вы можете просто использовать hidesBarsOnTap:

    navigationController?.hidesBarsOnTap = true

Ужасно, что эта проблема все еще сохраняется, 6 лет спустя. Я зарегистрировал ошибку, как описано в этом ответе . Лучше всего использовать старый (устаревший в iOS 9) API, упомянутый в вопросе OP, в сочетании с UINavigationController.setNavigationBarHidden(). Или вы жертвуете анимацией.

Другие вопросы по тегам