Как скрыть строку состояния и панель навигации при нажатии устройства
Как скрыть строку состояния и панель навигации, когда я нажимаю на устройство, как фотографии в iphone? Я использовал
UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.Slide)
но это не работает
Изменить: я хотел бы скрыть и показать строку состояния и панель навигации, а не скрыть ее навсегда.
3 ответа
В Swift 4 и iOS 11, в соответствии с вашими потребностями, вы можете выбрать один из трех следующих фрагментов кода, чтобы решить вашу проблему.
# 1. С помощью UINavigationController
hidesBarsOnTap
свойство + UIViewController
prefersStatusBarHidden
а также 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. С помощью UINavigationController
setNavigationBarHidden(_:animated:)
метод + UIViewController
prefersStatusBarHidden
а также 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. С помощью UINavigationController
setNavigationBarHidden(_:animated:)
метод + UIViewController
prefersStatusBarHidden
а также 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()
. Или вы жертвуете анимацией.