Каким должен быть лучший способ изменить цвет фона StatusBar и предпочитаемый StatusBarStyle? - PullRequest
0 голосов
/ 11 октября 2018

Мои требования такие, что в моем приложении есть два потока, поэтому для обоих потоков значение цвета Предпочитаемый StatusBarStyle & StatusBar различно.Поэтому, если у меня 40 viewControllers, 20 VC имеют одинаковые значения, а 20 VC имеют значения, отличные от первых 20 значений.

На данный момент я изменяю значения в каждом контроллере представления, например: -

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

override func viewDidLoad() {
    super.viewDidLoad()

    UIApplication.shared.statusBarView?.backgroundColor = AppColors.themeStatusColor
}

и в info.plist я сделал это: -

<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>

Можете ли вы, ребята, сказать мне как-нибудь, чтобы я мог написать эти строки кода только в двух местах, и я могу выполнить свои требования.

Ответы [ 3 ]

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

Этого можно добиться, создав два ViewController, как показано ниже:

// Для 20 VC с синей строкой состояния

class BaseVCBlue: UIViewController {

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

 override func viewDidLoad() {
        super.viewDidLoad()

    UIApplication.shared.statusBarView?.backgroundColor = UIColor.blue
    }

// Для 20 VC с красной строкой состояния

class BaseVCRed: UIViewController {

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

 override func viewDidLoad() {
        super.viewDidLoad()

    UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
    }

когда вам нужно, чтобы синяя строка состояния расширялась синим, а когда вы хотите, чтобы красный расширял красный.

0 голосов
/ 11 октября 2018
class BaseVCBlue: UIViewController {

override var preferredStatusBarStyle: UIStatusBarStyle {
    return UIStatusBarStyle.default
}

override func viewDidLoad() {
    super.viewDidLoad()

    self.setNeedsStatusBarAppearanceUpdate()
    UIApplication.shared.statusBarView?.backgroundColor = UIColor.white
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    self.setNeedsStatusBarAppearanceUpdate()
}
}



class BaseVc: UIViewController {

override var preferredStatusBarStyle: UIStatusBarStyle {
    return UIStatusBarStyle.lightContent
}

override func viewDidLoad() {
    super.viewDidLoad()

    UIApplication.shared.statusBarView?.backgroundColor = AppColors.themeStatusColor
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    self.setNeedsStatusBarAppearanceUpdate()
}

Но самый важный: - Есть один случай, когда это не сработает, и это если ваш контроллер встроен в стек навигации ?.Причина в том, что iOS хочет, чтобы родительский контроллер (а НЕ дочерний контроллер) решал, какую строку состояния нужно отображать, затем сделайте это также: -

extension UINavigationController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? .default
    }
}

Теперь вы можете легко изменить, и это будетотлично работает :)

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

Создать базовый контроллер вида (корневой) и расширить его.

class BaseViewController: UIViewController {

   override var preferredStatusBarStyle: UIStatusBarStyle {
      return .lightContent
   }

   override func viewDidLoad() {
      super.viewDidLoad()

    UIApplication.shared.statusBarView?.backgroundColor = AppColors.themeStatusColor
   }
}

Использование:

class MYSecondFlowController: BaseViewController {

}
...