【问题标题】:How can I make the Navigation Bar transparent?如何使导航栏透明?
【发布时间】:2021-11-03 20:13:34
【问题描述】:

如何使应用程序的这一部分(导航栏)半透明?我不希望它完全透明,我希望它显示网站内容的颜色并模糊。

Link with screenshot: iPhone 12 simulator with Navigation Bar Opaque

我已经查看了数十种可能性,但没有一种可行:

let bounds = self.navigationController?.navigationBar.bounds as CGRect!
let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .Light))
visualEffectView.frame = bounds
self.navigationController?.navigationBar.addSubview(visualEffectView)
self.navigationController.navigationBar.translucent = YES;

我也试过了:

let blurEffect = UIBlurEffect(style: UIBlurEffect.Style.dark)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame = (self.navigationController?.navigationBar.bounds)!
    self.navigationController?.navigationBar.addSubview(blurEffectView)darkUIBlurEffect.Style

还有这个:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) //UIImage.init(named: "transparent.png")
    self.navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.isTranslucent = true
    self.navigationController?.view.backgroundColor = .clear

还有这个:

self.navigationController?.navigationBar.isTranslucent = true

我也尝试使用 Main.storyboard 的 Attributes Inspector 并勾选 Translucent。

Attributes Inspector tab on Navigation Bar in Main.storyboard

没有方法有效。我该怎么办?

【问题讨论】:

标签: ios swift storyboard


【解决方案1】:

试试这个:

extension UIViewController {
    func blurNav(withAlpha alpha:CGFloat = 1.0 ) {
        let statusBarHeight = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
        let rect = navigationController?.navigationBar.bounds.insetBy(dx: 0, dy: -(statusBarHeight)).offsetBy(dx: 0, dy: -(statusBarHeight)) ?? .zero
        let blurView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
        blurView.frame = rect
        blurView.isUserInteractionEnabled = false
        blurView.alpha = alpha
        blurView.layer.zPosition = -1
        blurView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        navigationController?.navigationBar.addSubview(blurView)
        navigationController?.navigationBar.sendSubviewToBack(blurView)
    }
}

用法:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    blurNav(withAlpha: 0.8)
}

【讨论】:

  • 我是否将代码放在 ViewController 的第一个框中?
  • @gt138 在您想要半透明背景的任何控制器的viewdidappear 中调用扩展函数。
  • 我的控制器中没有viewDidAppear。我只有viewDidLoad。如果我在 super.ViewDidLoad() 下添加它,我会收到编译器错误 Declaration is only valid at file scope。我还添加了第二个代码 sn-p,现在我得到了Cannot find blurNav in scope
  • @gt138 这是一个扩展方法,你可以在你的控制器类中重写 viewdidappear 后直接调用 func。复制/粘贴代码库中的控制器扩展。
猜你喜欢
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 2018-11-27
相关资源
最近更新 更多