iphone 12 mini 的导航栏背景图像着色不正确

incorrect Navigation bar background image coloring for iphone 12 mini

我正在将导航栏的图像设置为渐变。这适用于除 iPhone 12 mini 之外的所有型号。

我已经尝试在 ViewWillAppear、viewDidAppear 和 ViewDidLoad 的主视图控制器上调用它

这是它在所有其他型号上的样子

    func setNavGradiant(){
    guard let navigationController = self.navigationController else {print("❇️♊️>>>\(#file) \(#line): guard let failed<<<"); return}
    let gradientLayer = CAGradientLayer()
    var updatedFrame = navigationController.navigationBar.bounds
    updatedFrame.size.height += UIApplication.shared.windows[0].windowScene?.statusBarManager?.statusBarFrame.height ?? 0

   
   
    gradientLayer.frame = updatedFrame
    gradientLayer.colors = [ #colorLiteral(red: 0.4392156899, green: 0.01176470611, blue: 0.1921568662, alpha: 1).cgColor,  #colorLiteral(red: 0.2196078449, green: 0.007843137719, blue: 0.8549019694, alpha: 1).cgColor] // start color and end color
    gradientLayer.startPoint = CGPoint(x: 0.5, y: 0.0) // vertical gradient start
    gradientLayer.endPoint = CGPoint(x: 0.5, y: 1.0)
    UIGraphicsBeginImageContext(gradientLayer.bounds.size)
    gradientLayer.render(in: UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    
    UIGraphicsEndImageContext()
    
    self.navigationController?.navigationBar.setBackgroundImage(image, for: UIBarMetrics.default)
    self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor(#colorLiteral(red: 0.9579688907, green: 0.9579688907, blue: 0.9579688907, alpha: 1))]
}

通过子类化您可能会得到更好的结果 UINavigationController:

class MyNavigationController: UINavigationController {

    let gradient = CAGradientLayer()

    override func viewDidLoad() {
        super.viewDidLoad()
    
        gradient.frame = navigationBar.bounds
        
        gradient.colors = [ #colorLiteral(red: 0.4392156899, green: 0.01176470611, blue: 0.1921568662, alpha: 1).cgColor,  #colorLiteral(red: 0.2196078449, green: 0.007843137719, blue: 0.8549019694, alpha: 1).cgColor] // start color and end color
        gradient.startPoint = CGPoint(x: 0.5, y: 0.0) // vertical gradient start
        gradient.endPoint = CGPoint(x: 0.5, y: 1.0)
        
        if let image = getImageFrom(gradientLayer: gradient) {
            navigationBar.setBackgroundImage(image, for: UIBarMetrics.default)
        }

    }

    func getImageFrom(gradientLayer:CAGradientLayer) -> UIImage? {
        var gradientImage:UIImage?
        UIGraphicsBeginImageContext(gradientLayer.frame.size)
        if let context = UIGraphicsGetCurrentContext() {
            gradientLayer.render(in: context)
            gradientImage = UIGraphicsGetImageFromCurrentImageContext()?.resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: .stretch)
        }
        UIGraphicsEndImageContext()
        return gradientImage
    }

}

试试打电话:

DispatchQueue.main.async {
            self.setNeedsStatusBarAppearanceUpdate()
        }

设置完成后。应该在不分派到主线程的情况下工作,但我之前发现了从生命周期方法调用的东西不在主线程上的问题。所以要检查的另一件事是确保你是 运行 主线程上的更新。