По сути, все, что вам нужно, это базовый виртуальный канал, который вы будете размещать в подклассах тех виртуальных каналов, которыми вы хотите управлять в строке состояния.Там вы будете подписываться на данное Уведомление, которое при отправке будет контролировать строку состояния ВК.
Вот код:
extension Notification.Name {
static var statusBarShowHide: Notification.Name {
return .init(rawValue: "StatusBar.showHide")
}
}
class StatusBarControllableVC : UIViewController {
private var statusBarHidden = false
private func topViewController() -> UIViewController? {
var topController = UIApplication.shared.keyWindow?.rootViewController
while topController?.presentedViewController != nil {
topController = topController?.presentedViewController
}
return topController
}
override var prefersStatusBarHidden: Bool {
return statusBarHidden
}
@objc func statusBarShowHide(notification: NSNotification) {
guard let userInfo = notification.userInfo else {return}
let topController = topViewController()
if let hidden = userInfo["hidden"] as? Bool, self == topController {
statusBarHidden = hidden
self.setNeedsStatusBarAppearanceUpdate()
}
}
override func viewDidLoad() {
NotificationCenter.default.addObserver(self, selector: #selector(statusBarShowHide(notification:)), name: .statusBarShowHide, object: nil)
super.viewDidLoad()
}
}
Сейчасвсякий раз, когда вам нужно показать или скрыть строку состояния, вы будете публиковать уведомления, например, такие:
NotificationCenter.default.post(name: .statusBarShowHide, object: nil, userInfo: ["hidden":true])
Я считаю, что это самый простой подход.В приведенном выше коде я только показываю / скрываю строку состояния на самом верхнем контроллере представления, но, очевидно, вы можете изменить это