代码之家  ›  专栏  ›  技术社区  ›  Dani iman kazemayni

UIStatusBarStyle不会改变

  •  0
  • Dani iman kazemayni  · 技术社区  · 7 年前

    我正在开发一个快速的应用程序,我想改变 UIStatusBarStyle View controller-based status bar appearance NO info.plist UIViewController

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return Theme.current.statusBarStyle
    }
    
    
    protocol ThemeProtocol { 
        // Status Bar
        var statusBarStyle: UIStatusBarStyle { get } 
    }
    
    class Theme {
        static var current: ThemeProtocol = LightTheme()
    }
    
    class LightTheme: ThemeProtocol {
        // Status Bar 
        var statusBarStyle: UIStatusBarStyle = .default
    
    }
    
    class DarkTheme: ThemeProtocol {
        // Status Bar 
        var statusBarStyle: UIStatusBarStyle = .lightContent
    
    }
    

    真的没有结果。我试图通过返回来测试它: return .lightContent 但这也没有改变状态栏。

    更新:

    好吧,这就是我想做的,但没用。

        fileprivate func applyTheme() {
    
        statusBarStyle = UserDefaults.standard.bool(forKey: SelectedThemeKey) ? .default : .lightContent
        self.setNeedsStatusBarAppearanceUpdate()
    
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarStyle
    }
    

    applyTheme() 被召入 viewDidLoad() viewWillAppear()

    3 回复  |  直到 7 年前
        1
  •  3
  •   Shehata Gamal    7 年前

    更改后需要调用此方法

    setNeedsStatusBarAppearanceUpdate()
    

    //

    class ViewController: UIViewController {
    
        var current = UIStatusBarStyle.default
    
        @IBAction func changeClicked(_ sender: Any) {
            current = current == .default ? .lightContent : .default
            self.setNeedsStatusBarAppearanceUpdate()
        }
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
        }
        override  var preferredStatusBarStyle: UIStatusBarStyle {
            return current
        }
    
    }
    

    enter image description here

        2
  •  2
  •   matt    7 年前

    我已在info.plist中将基于视图控制器的状态栏外观设置为NO,并在UIViewController中尝试将其设置为NO

    所以一方面你告诉运行时

    其次,请记住,除非视图控制器是顶级视图控制器(或者顶级视图控制器故意遵从它),否则视图控制器在状态栏外观中没有发言权。例如,如果视图控制器位于导航控制器内,则 statusBarStyle 完全无关。

        3
  •  0
  •   張家齊    7 年前

    弗斯特

    如果你想改变 StatusBarStyle 具有 UIApplication.shared.statusBarStyle = .default ,那么您应该设置 View controller-based status bar appearance 成为 NO

    这样,你需要控制 UIApplication.shared.statusBarStyle viewWillAppear / viewWillDisappear .

    现在我建议你学习新方法:

    请设置 YES ,和

    覆盖 UIViewController preferredStatusBarStyle 去处理它。

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .default
    }
    

    对你来说,我想 uiview控制器 viewControllers 属于 UINavigationController .

    如果你用 ,您应该覆盖 首选状态栏样式 .

    也许你会说我需要用不同的视图控制器设置不同的状态栏样式,没关系。

    只是覆盖 childForStatusBarStyle 在里面 这样地

    override var childForStatusBarStyle: UIViewController? {
        return topViewController
    }
    

    然后覆盖 首选状态栏样式 在里面 你想改变。

    你也可以通过 extension 这样地

    extension UINavigationController {
        override open var childForStatusBarStyle: UIViewController? {
            return topViewController
        }
    }