首页 > 解决方案 > 如何撤消 iOS 11 中的透明导航栏?

问题描述

我正在尝试在 iOS 11 中创建一个透明的导航栏。

我将以下代码放在 VC 中,它可以工作,但是当另一个 VC 被推到顶部时它保持透明。

(我认为再次将 backgroundImage 设置为 nil 会起作用,但事实并非如此。)

新VC推送时如何获得白色背景?

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.prefersLargeTitles = false
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationController?.navigationBar.prefersLargeTitles = true
    self.navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
    self.navigationController?.navigationBar.shadowImage = nil
}

标签: swiftuinavigationcontrolleruinavigationbar

解决方案


您可以添加扩展以简化与UINavigationBar的交互

extension UINavigationBar {

    func makeTransparent() {
        self.setBackgroundImage(UIImage(), for: .default)
        self.shadowImage = UIImage()
        self.isTranslucent = true
    }

    func undoTransparency() {
        self.setBackgroundImage(nil, for: .default)
    }

    func makeLargeAndTransparent() {
        makeTransparent()

        self.prefersLargeTitles = true
        self.backgroundColor = .clear
        self.barTintColor = *barTintColor*
        self.tintColor = *tintColor*
        self.largeTitleTextAttributes = [
             .font: *font.of(size: 34)*,
             .foregroundColor: *foregroundColor*
        ]

        self.titleTextAttributes = [
             .font: *font.of(size: 17)*,
             .foregroundColor: *foregroundColor*
        ]
    }

    func makeDefault() {
        undoTransparency()

        self.prefersLargeTitles = false

        self.barTintColor = *barTintColor*
        self.tintColor = *tintColor*
        self.titleTextAttributes = [
            .font: *font.of(size: 17)*,
            .foregroundColor: *foregroundColor*
        ]
    }
}

推荐阅读