iOS中的自定义导航抽屉中状态栏颜色是否变为白色?

时间:2017-11-23 05:20:31

标签: ios swift xcode statusbar

我在swift中创建了一个自定义导航抽屉。我使用了app delegate&的窗口。添加了关于挡风玻璃的观点。隐藏后,单击按钮显示视图。

下面的代码来创建抽屉。

func setupSideMenu(){

        windowSideMenu = ((UIApplication.shared.delegate?.window)!)!
        windowSideMenu.backgroundColor = UIColor.black
        if customView == nil {
            print("custom view nil")
            // Register Swipe gesture for opening slideMenu
            let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.openSideMenu))
            swipeRight.direction = UISwipeGestureRecognizerDirection.right
            self.view.addGestureRecognizer(swipeRight)

            /// Register Drawable NIB here only for once
            customView = SideView.instanceFromNib() as! SideView
            customView.configureDrawer()
            customView.navigationController = self.navigationController
            customView.frame = CGRect(x: -customView.frame.size.width, y: -10, width: self.view.bounds.size.width - 30, height:UIScreen.main.bounds.height)
            customView.drawerDelegate = self

            /// BackView (DimView)
            backView.frame = self.view.frame
            backView.backgroundColor = UIColor.black
            backView.alpha = 0.4
            backView.isHidden = true
            self.view.addSubview(backView)
            let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.closeSideMenu))
            backView.addGestureRecognizer(tapGesture)
            customView.isHidden = true
            windowSideMenu.addSubview(customView)
            windowSideMenu.makeKeyAndVisible()

        }
    }

隐藏&显示我更改窗口级别UIWindowLevel

  override func openSideMenu() {
        super.openSideMenu()
        self.windowSideMenu.windowLevel = UIWindowLevelStatusBar
    }

    override func closeSideMenu() {
        super.closeSideMenu()
        self.windowSideMenu.windowLevel = UIWindowLevelNormal

    }

但是当我将windowlevel更改为UIWindowLevelStatusBar时,状态栏的颜色设置为白色。

这是抽屉的屏幕截图 enter image description here

抱歉,我不得不改变一些颜色,因为我无法展示整个设计。

6 个答案:

答案 0 :(得分:2)

当我开始理解这个问题时,由于侧面菜单要克服这个问题,我们有一个library非常容易定制

要设置或更改根,左或右视图控制器或视图,请致电:

sideMenuController.rootViewController = rootViewController
sideMenuController.leftViewController = leftViewController
sideMenuController.rightViewController = rightViewController

sideMenuController.rootView = rootView
sideMenuController.leftView = leftView
sideMenuController.rightView = rightView

希望这会对你有所帮助

答案 1 :(得分:1)

可能是因为您的SideView有白色背景。尝试在故事板中更改它

答案 2 :(得分:1)

据我所知,你试图让状态栏保持相同的颜色(黑色)。但是当SlideMenu的窗口级别改变时,它将变为默认的白色。我也看到你正在设置customView.navigationController = self.navigationController。 navigationController是一个类,所以它通过引用传递而不是通过副本传递,但由于某种原因,导航栏颜色被重置为默认的白色(可能另一个VC的颜色是白色,它正在使用它,在其他颜色中设置颜色)用于确定是否是原因的VC)在分配导航控制器后尝试重置颜色:

 customView.navigationController?.navigationBar.tintColor = UIColor.black

此外,您应该将ui更改为异步,以避免阻塞主线程。由于UIWindowLevelStatusBar是CGFloat,因此您可以像这样设置它以避免与实际状态栏发生冲突。

        DispatchQueue.main.async(execute: {
            if let window = UIApplication.shared.keyWindow {
                window.windowLevel = UIWindowLevelStatusBar + 1
            }
          }


        DispatchQueue.main.async(execute: {
            if let window = UIApplication.shared.keyWindow {
                window.windowLevel = UIWindowLevelNormal
            }
          }

调试器中视图层次结构的屏幕截图也有助于确定根本原因。希望这有帮助,祝你好运!

答案 3 :(得分:1)

您是否尝试在prefersStatusBarHidden的{​​{1}}上实施root view controller方法?也许这对你有帮助。

例如:

UIWindow

答案 4 :(得分:0)

当抽屉菜单显示SlideMenuController.swift时,您可以查看此库如何管理显示/隐藏状态栏,我认为这与您想要的效果相同:(Gift)。我现在正在使用它,并且很容易定制。

菜单打开时:

...
DispatchQueue.main.async(execute: {
            if let window = UIApplication.shared.keyWindow {
                window.windowLevel = UIWindowLevelStatusBar + 1
            }
        })

菜单关闭时:

...
DispatchQueue.main.async(execute: {
            if let window = UIApplication.shared.keyWindow {
                window.windowLevel = UIWindowLevelNormal
            }
        })

希望这会对你有所帮助,问候!

答案 5 :(得分:0)

对于你的答案,有不同的可能性..

可能的方式:1
如果您使用的是xcode 9.0+,那么iPhone X可以在模拟器中使用,并且存在安全视图的新概念,因此您可以对安全视图给出最大限制,以便在状态栏后面显示此白色条带。 (如果提及与您相关的详细信息,那么解决方案是给主视图的约束而不是safeView)或者您也可以尝试下面的代码..

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        UIApplication.shared.statusBarView?.backgroundColor = UIColor.black

        return true
    }

可能的方式:2
此幻灯片效果可以使用一个库。它的名字是SlideMenuControllerSwift

在此库中可以使用不同的选项,因此您可以更改状态栏。

SlideMenuOptions.contentViewScale = 1.0
        SlideMenuOptions.leftViewWidth = UIScreen.main.bounds.size.width * 0.6

        let leftVC = UIStoryboard().getViewController(viewController: "LeftView") as! LeftView
        let mainVC = UIStoryboard().getViewController(viewController: "MenuView")

        let slideMenuController = SlideMenuController(mainViewController: mainVC, leftMenuViewController: leftVC)
        SlideMenuOptions.hideStatusBar = false

        self.window?.rootViewController = slideMenuController
        self.window?.makeKeyAndVisible()

可能的方式:3 enter image description here 因此,将其添加到info.plist中,然后根据您的要求应用以下更改。 enter image description here

所以从这三种方式尝试任何一种方法可以帮助你解决问题。 快乐的编码:)