我在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
时,状态栏的颜色设置为白色。
抱歉,我不得不改变一些颜色,因为我无法展示整个设计。
答案 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 因此,将其添加到info.plist中,然后根据您的要求应用以下更改。
所以从这三种方式尝试任何一种方法可以帮助你解决问题。 快乐的编码:)