繁体   English   中英

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

[英]Status bar color changed to white in custom navigation drawer in iOS?

我在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

    }

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

这是抽屉的屏幕截图 在此输入图像描述

对不起,我不得不改变一些颜色,因为我无法显示整个设计。

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

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

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

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

希望这个能对您有所帮助

也许是因为你的SideView有白色背景。 尝试在故事板中更改它

据我所知,你试图让状态栏保持相同的颜色(黑色)。 但是当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
            }
          }

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

您是否尝试在UIWindowroot view controller上实现prefersStatusBarHidden方法? 也许它可以帮助你解决问题。

例如:

- (UIStatusBarStyle) preferredStatusBarStyle {
    return UIStatusBarStyleDarkContent;
}

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

菜单打开时:

...
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
            }
        })

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

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

可能的方式: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 在此输入图像描述 因此,将其添加到info.plist中,然后根据您的要求应用以下更改。 在此输入图像描述

因此,从这3种方式尝试任何一种可能它可以帮助您解决您的问题。 快乐编码:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM