【问题标题】:Swift 5 custom navigation bar cover title and buttonsSwift 5 自定义导航栏封面标题和按钮
【发布时间】:2021-03-19 11:44:53
【问题描述】:

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

import UIKit

class 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 中,我为导航控制器项选择了自定义类。

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

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

我正在使用 Xcode 12.4,我正在 iPhone Xr 上运行该应用程序。

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

非常感谢。

【问题讨论】:

    标签: ios swift xcode


    【解决方案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]
    
        backgroundImage.image = UIImage()
    
        // 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 视图层次结构中,而且我观察到这两种方法都不会影响栏控件的可见性。

    【讨论】:

    • 对不起,这不是我想要达到的。如果我使用您的代码并将 .dark 作为模糊效果,则不会发生任何事情......我想要完全控制模糊效果和子视图。无论如何感谢您的帮助
    • 使用backgroundImage可能是你最好的选择,我的例子最初没有设置UIImage到背景UIImageView,我已经修改了例子
    猜你喜欢
    • 2020-01-07
    • 2014-10-13
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2011-09-04
    相关资源
    最近更新 更多