如何使导航栏透明?

How can I make the Navigation Bar transparent?

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

Link with screenshot: iPhone 12 simulator with Navigation Bar Opaque

我研究了数十种可能性并且 none 成功了:

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 tab on Navigation Bar in Main.storyboard

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

试试这个:

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