使用uiappearance使uinavigationbar具有梯度背景



在此问题之后,我可以为UINavigationBar做一个背景梯度,但是当我尝试通过UIAppearance设置它时,该应用程序在didFinishLaunching中崩溃,因为没有当前的CGContext。我该如何解决此问题,并且在应用程序委托中仍然拥有我的所有UIAppearance代码?

didFinishLaunching中的return true之前被调用的代码:

private func setNavBarAppearance() {
    let titleAttributes: [NSAttributedStringKey: Any] = [.foregroundColor: UIColor.white]
    UINavigationBar.appearance().titleTextAttributes = titleAttributes
    UINavigationBar.appearance().barTintColor = .white
    UINavigationBar.appearance().tintColor = .white
    UINavigationBar.appearance().makeTransparent()
    // Set gradient
    let colors = [UIColor.lavender.cgColor, UIColor.mint.cgColor]
    let gradientLayer = CAGradientLayer()
    gradientLayer.frame = UINavigationBar.appearance().bounds
    gradientLayer.colors = colors
    gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
    gradientLayer.endPoint = CGPoint(x: 0.5, y: 0.5)
    let image = UIImage(layer: gradientLayer)
    UINavigationBar.appearance().setBackgroundImage(image, for: .default)
}

调用UIGraphicsBeginImageContext时,必须提供非零的CGRect。就我而言,我将框架设置为UINavigationBar.appearance().bounds,该框架在应用程序委托中为零RECT。为了解决这个问题,我只需将梯度frame设置为CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 1)

最新更新