是否可以通过协议自定义UINavigationBar?

问题描述 投票:0回答:1

我想为某些视图控制器自定义UINavigationBar。由于某些原因,我cannot只是简单地扩展UIViewController。所以我试图通过协议来做到这一点。

我尝试过的:

protocol TransparentNavigationBarProtocol {
    func makeNavigationBarTransparent()
}

extension TransparentNavigationBarProtocol where Self: UIViewController {

    func makeNavigationBarTransparent() {
        if let navController = navigationController {
            navController.navigationBar.setBackgroundImage(UIImage(), for: .default)
            navController.navigationBar.shadowImage = UIImage()
            navController.navigationBar.tintColor = UIColor.white
            navController.navigationBar.barStyle = .blackTranslucent
            navController.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
            navController.navigationBar.backgroundColor = .clear
        }
    }

}

我添加了一些断点,这些断点表明该函数已成功调用,但NavigationBar并未更改。所以我想知道是否可以通过协议实现这一目标?

swift uiviewcontroller uinavigationbar protocols
1个回答
0
投票

对于Xcode11,您需要设置图片,而不是nil

此外,在您的viewcontroller的viewWillAppear中,您需要调用makeNavigationBarTransparent()

func makeNavigationBarTransparent() {
    if let navController = navigationController {
        navController.navigationBar.setBackgroundImage(UIImage(), for: .default)
        navController.navigationBar.shadowImage = UIImage()
        navController.navigationBar.tintColor = UIColor.init(red: 74/255, green: 74/255, blue: 74/255, alpha: 1)
        navController.navigationBar.barStyle = .default
        navController.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor(red: 74/255, green: 74/255, blue: 74/255, alpha: 1)]
    }
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    makeNavigationBarTransparent()
}
© www.soinside.com 2019 - 2024. All rights reserved.