在 Swift iOS 8 中设置透明导航栏和状态栏的图像底图
Posted
技术标签:
【中文标题】在 Swift iOS 8 中设置透明导航栏和状态栏的图像底图【英文标题】:Set Image Underlay of Transparent Navigation Bar and Status Bar in Swift iOS 8 【发布时间】:2015-07-14 06:23:50 【问题描述】:我是 ios swift 开发的新手,我遇到了一个问题。我想设置透明导航栏,并制作透明导航栏和状态栏的图像底层,如下图所示,
但是在我实现了下面的代码之后,
self.navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationController!.navigationBar.shadowImage = UIImage()
self.navigationController!.navigationBar.translucent = true
即使我将导航栏设置为透明,结果仍然是导航栏和状态栏下方的图像。
【问题讨论】:
Make UINavigationBar transparent 的可能重复项 【参考方案1】:如果您没有使用默认导航栏,则将背景图像视图(将在状态栏下方可见)从顶部约束向上移动 20 像素,然后使用以下命令清除状态栏背景颜色:
override func viewDidLoad()
super.viewDidLoad()
let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
statusBar?.backgroundColor = UIColor.clear
如果要将状态栏项的颜色更改为白色,请使用:
override var preferredStatusBarStyle: UIStatusBarStyle
return .lightContent
输出将是
【讨论】:
我正在使用带有静态单元格的 tableview 控制器。并且图像视图位于第 0 个标题单元格中,覆盖 statusBarStyle 使其半透明,但不知何故,图像从状态栏下方开始,我还将上边距更新为 -20。知道为什么会这样吗? @UsamabinAttique 如果你必须将上边距设置为 -20 你做错了什么。由于系统栏大约有 20 个点的高度。您可能连接到安全区域或系统栏而不是超级视图【参考方案2】:我已经尝试了与您提供的相同的代码:
override func viewDidLoad()
super.viewDidLoad()
self.navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationController!.navigationBar.shadowImage = UIImage()
self.navigationController!.navigationBar.translucent = true
它工作正常,你可以在这里看到结果:
检查我的sample 项目,看看你缺少什么。
希望它会有所帮助。
【讨论】:
1) 顶部约束必须是superview
,而不是safe area
。 2)如果你有tableV并使用ios11添加tableV.contentInsetAdjustmentBehavior = .never
【参考方案3】:
我通过为状态栏背景设置透明 UIColor 解决了这个问题。
guard let statusBar = UIApplication.sharedApplication().valueForKey("statusBarWindow")?.valueForKey("statusBar") as? UIView else
return
statusBar.backgroundColor = UIColor(red: 2, green: 200.0, blue: 200, alpha: 0) // color value has no effect. Only alpha value is needed to make it transparent
【讨论】:
Swift 5.1 iOS 13 守卫让 statusBar = (UIApplication.shared.value(forKey: "statusBarWindow")? as AnyObject).value("statusBar") as? UIView else return 无法使用类型为“(字符串)”的参数列表调用“值”【参考方案4】:根据 Dharmesh 的回答,但已针对 Swift 4 进行了更新
self.navigationController!.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController!.navigationBar.shadowImage = UIImage()
self.navigationController!.navigationBar.isTranslucent = true
【讨论】:
以上是关于在 Swift iOS 8 中设置透明导航栏和状态栏的图像底图的主要内容,如果未能解决你的问题,请参考以下文章