You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 15下Objective-C如何通过UINavigationBarAppearance设置导航栏渐变背景

实现方案

你需要将渐变效果渲染为UIImage,再赋值给UINavigationBarAppearance的backgroundImage属性即可实现需求,具体实现步骤如下:

步骤1:添加渐变图片生成方法

你可以将该方法封装成UIImage分类,或者直接放在当前实现文件中使用,示例OC代码如下:

/// 生成线性渐变UIImage
/// @param size 图片尺寸 传导航栏+状态栏总尺寸即可适配
/// @param startColor 渐变起始颜色
/// @param endColor 渐变结束颜色
/// @param startPoint 渐变起始位置 (0,0)为左上角 (1,1)为右下角
/// @param endPoint 渐变结束位置
+ (UIImage *)gradientImageWithSize:(CGSize)size startColor:(UIColor *)startColor endColor:(UIColor *)endColor startPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint {
    UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:size];
    return [renderer imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull rendererContext) {
        CGContextRef context = rendererContext.CGContext;
        NSArray *colors = @[(id)startColor.CGColor, (id)endColor.CGColor];
        CGGradientRef gradient = CGGradientCreateWithColors(CGColorSpaceCreateDeviceRGB(), (CFArrayRef)colors, nil);
        CGContextDrawLinearGradient(context, gradient, 
            CGPointMake(size.width * startPoint.x, size.height * startPoint.y), 
            CGPointMake(size.width * endPoint.x, size.height * endPoint.y), 
            kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
        CGGradientRelease(gradient);
    }];
}

步骤2:修改原有iOS15适配代码

替换原来[appearance setBackgroundColor:startColor]的代码,改为设置渐变背景图,修改后完整代码如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 原有初始化逻辑保留
    if (@available(iOS 15, *)){
        UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init];
        [appearance configureWithTransparentBackground];
        // 计算导航栏总尺寸(状态栏高度+导航栏本身高度44)
        CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
        CGSize navTotalSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 44 + statusBarHeight);
        // 生成渐变图片,示例为从上到下渐变,可自行调整startPoint、endPoint修改渐变方向
        UIImage *gradientBg = [self gradientImageWithSize:navTotalSize 
                                                startColor:startColor 
                                                  endColor:endColor 
                                                startPoint:CGPointMake(0, 0) 
                                                  endPoint:CGPointMake(0, 1)];
        // 赋值渐变背景图
        appearance.backgroundImage = gradientBg;
        // 可选:去掉导航栏底部分隔线,不需要可删除此行
        appearance.shadowColor = [UIColor clearColor];
        
        [UINavigationBar appearance].standardAppearance = appearance;
        [UINavigationBar appearance].scrollEdgeAppearance = appearance;
    }
    return YES;
}

注意事项

  • 如果你的App支持横竖屏切换,需要在横竖屏切换回调中重新生成对应宽度的渐变图片,重新赋值给当前导航控制器的导航栏外观属性即可
  • 如果全App导航栏渐变规则统一,也可以将渐变图片设置为左右可拉伸,无需每次横竖屏切换都重新生成图片

内容的提问来源于stack exchange,提问作者Fabrizio L.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:54:05