Xcode 12设置UINavigationBar渐变背景显示为白色问题求助
问题原因及修复方案
1. 核心错误:RGB颜色值未归一化
iOS 中 UIColor(red:green:blue:alpha:) 构造方法要求传入的RGB参数取值范围为 0.0 ~ 1.0,你直接传入85、181这类大于1的数值时,系统会默认将其截断为1.0,最终两个渐变色都被识别为纯白色,这是导航栏显示白色的主要原因。
同时gradient.colors要求传入CGColor类型数组,原代码直接传入UIColor也会导致渐变颜色识别错误。你需要修正颜色赋值逻辑:
// 修正后的颜色赋值 gradient.colors = [ UIColor(red: 85/255.0, green: 181/255.0, blue: 180/255.0, alpha: 1).cgColor, UIColor(red: 76/255.0, green: 144/255.0, blue: 172/255.0, alpha: 1).cgColor ]
2. 其他可能导致不生效的问题
2.1 调用时机不对
viewDidLoad阶段导航栏的布局还未完成,此时获取的bounds尺寸不准确,建议将调用逻辑移到viewWillAppear或viewDidLayoutSubviews中。
2.2 高版本iOS系统适配缺失
iOS 13及以上系统引入了UINavigationBarAppearance管理导航栏样式,仅调用setBackgroundImage会被系统默认外观覆盖,需要补充适配逻辑,修正后的完整扩展代码如下:
extension UINavigationBar { func setGradientBackground(to navController: UINavigationController) { let gradient = CAGradientLayer() var bounds = navController.navigationBar.bounds // 适配新系统状态栏高度获取 let statusBarHeight = navController.view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0 bounds.size.height += statusBarHeight gradient.frame = bounds // 修正颜色值 + 转CGColor gradient.colors = [ UIColor(red: 85/255.0, green: 181/255.0, blue: 180/255.0, alpha: 1).cgColor, UIColor(red: 76/255.0, green: 144/255.0, blue: 172/255.0, alpha: 1).cgColor ] gradient.startPoint = CGPoint(x: 0.5, y: 0) gradient.endPoint = CGPoint(x: 0.5, y: 1) if let image = getImageFrom(gradientLayer: gradient) { // 适配iOS13+外观规则 if #available(iOS 13.0, *) { let appearance = UINavigationBarAppearance() appearance.backgroundImage = image appearance.shadowColor = .clear navController.navigationBar.standardAppearance = appearance navController.navigationBar.scrollEdgeAppearance = appearance } else { navController.navigationBar.setBackgroundImage(image, for: .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 } }
内容的提问来源于stack exchange,提问作者Ανδρέας Λ. Βασιλείου
相关产品推荐
相关产品推荐

