предпочитаемое значение StatusBarHidden в пользовательской ячейке и классе объекта - PullRequest
0 голосов
/ 02 октября 2018

Поскольку setStatusBarHidden устарело, мы будем использовать предпочитаемыйStatusBarHidden в UIViewControllers.Но как мне спрятать и показать легко в объектном классе или в пользовательском UITableviewCell классе.Раньше мы скрывали шоу, используя UIApplication вот так

[[UIApplication sharedApplication] setStatusBarHidden:YES];

Теперь оно устарело и его можно использовать только в UIViewControllers, есть ли способ скрыть их в пользовательских ячейках таблицы и NSObjectклассы?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

prefersStatusBarHidden - это метод UIViewController объектов, а не UIApplication.Таким образом, вы должны установить его на UIViewController.Вот так.

- (BOOL)prefersStatusBarHidden {

   return NO;
}

Примечание:

  • Если вы измените возвращаемое значение для этого метода, вызовите метод setNeedsStatusBarAppearanceUpdate.
  • Для childViewController, чтобы указать, что дочерний контроллер представления должен контролировать предпочтительную скрытую / невидимую строку состояния, используйте метод childViewControllerForStatusBarHidden.

, если вы хотите более динамически скрыватьили показать строку состояния

Вы можете применить логику следующим образом:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { shouldHideStatusBar = (shouldHideStatusBar)? NO: YES; [self setNeedsStatusBarAppearanceUpdate]; }

Вы также можете добавить этот код в событие кнопки

, убедитесь, чтодобавьте в ваш info.plist «Просмотр внешнего вида строки состояния на основе контроллера», установите значение «ДА», в противном случае, кажется, что все просто не работает.

0 голосов
/ 02 октября 2018

По сути, все, что вам нужно, это базовый виртуальный канал, который вы будете размещать в подклассах тех виртуальных каналов, которыми вы хотите управлять в строке состояния.Там вы будете подписываться на данное Уведомление, которое при отправке будет контролировать строку состояния ВК.

Вот код:

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])

Я считаю, что это самый простой подход.В приведенном выше коде я только показываю / скрываю строку состояния на самом верхнем контроллере представления, но, очевидно, вы можете изменить это

...