0

我的要求是,在我的应用程序中有两个流程,因此对于两个流程的首选状态栏样式和状态栏背景颜色的值是不同的。因此,如果我有 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/>

你们能告诉我任何方式,这样我就可以只在两个地方编写这些代码行,我就可以达到我的要求。

4

3 回答 3

1

您可以通过创建两个 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
    }

当您需要蓝色状态栏时扩展蓝色,当您需要红色时扩展红色。

于 2018-10-11T05:50:48.390 回答
1

创建基本视图控制器(根)并扩展它。

class BaseViewController: UIViewController {

   override var preferredStatusBarStyle: UIStatusBarStyle {
      return .lightContent
   }

   override func viewDidLoad() {
      super.viewDidLoad()

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

利用:

class MYSecondFlowController: BaseViewController {

}
于 2018-10-11T05:46:55.433 回答
1
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
    }
}

现在你可以很容易地改变,这将完美地工作:)

于 2018-10-11T06:04:24.177 回答