提问者:小点点

Swift 5自定义导航栏封面标题和按钮


在寻求了很多,尝试了很多解决方案后,没有解决我的问题。在我的应用程序中,我自定义了UINavigationController以获得模糊效果:

类CustomNavigationController:UINavigationController{

override func viewDidLoad() {
    super.viewDidLoad()

    let visualEffectView   = UIVisualEffectView(effect: UIBlurEffect(style: .regular))
    visualEffectView.frame = (self.navigationBar.bounds.insetBy(dx: 0, dy: -40).offsetBy(dx: 0, dy: -40))
    self.navigationBar.isTranslucent = true
    self.navigationBar.setBackgroundImage(UIImage(), for: .default)
    self.navigationBar.addSubview(visualEffectView)
    self.navigationBar.sendSubviewToBack(visualEffectView)
}

}

然后,在Main.Storyboard中,我为导航控制器项选择了自定义类。

模糊效果工作正常,状态图标正确可见,但不是标准的导航栏项:左按钮,标题和右按钮。

它们会出现片刻,但在自定义导航栏覆盖它们之后不久。

我正在使用Xcode12.4并在iPhone XR上运行该应用程序。

如何再次显示导航栏元素?

提前多谢了。


共1个答案

匿名用户

iOS中的半透明导航栏已经模糊了栏后的内容,因此您不需要添加UIVisualEffectView,也不需要设置BackgroundImage

如果将代码修改为:

override func viewDidLoad() 
{
    super.viewDidLoad()
    self.navigationBar.isTranslucent = true
}

这没有达到你所要的视觉效果吗?

如果没有,请尝试对您的方法进行以下调整:

override func viewDidLoad() 
{
    super.viewDidLoad()

    self.navigationBar.isTranslucent = true

    // create a UIImageView
    let backgroundImage: UIImageView = UIImageView()
    backgroundImage.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    // add a blur effect to the ImageView
    let visualEffectView: UIVisualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .regular))
    visualEffectView.frame = (self.navigationBar.bounds.insetBy(dx: 0, dy: -40).offsetBy(dx: 0, dy: -40))
    backgroundImage.addSubview (visualEffectView)

    // and set that as your backgroundImage on the navigationBar
    self.navigationBar.setBackgroundImage(backgroundImage.image, for: .default)
}

这增加了背景图像的模糊效果。这似乎对我有用,但视觉效果与仅仅使用我的第一个建议没有什么不同,可能是因为backgroundimage.image==nil

这当然是一种改进的方法,因为它不会向UINavigationBar视图层次结构中添加意外的子视图,而且我注意到这两种方法都不会影响条控件的可见性。