iOS15下导航栏(Navi)背景图消失

最近用测试机发现push后顶部导航栏的背景图消失。
搜集了资料后从ios13开始UINavigationBarAppearance需要设置,但在在ios15强制执行了,所以15上会出现问题。

出现问题:


261640834527_.pic.jpg

希望的样子:


221640833520_.pic.jpg

第一次修改

那么针对15处理一下(项目的navbar由base类控制,所以直接在其中修改统一样式):

    UIImage *bgImage = [UIImage imageNamed:@"你的图片name"];
//判断系统
    if (@available(iOS 13.0, *)) {
        UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
        [appearance configureWithOpaqueBackground];
        //设置背景图
        appearance.backgroundImage = bgImage; 
        self.navigationBar.standardAppearance = appearance;
        self.navigationBar.scrollEdgeAppearance=self.navigationBar.standardAppearance;
        }
    //原来写的也要保留
    [self.navigationBar setBackgroundImage: bgImage forBarMetrics:UIBarMetricsDefault];

好的看下结果:


241640833520_.pic.jpg

图片被压缩了并不是我要的,改下ContentMode

第二次修改

UIImage *bgImage = [UIImage imageNamed:@"你的图片name"];
//先判断下系统
    if (@available(iOS 13.0, *)) {
        UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
        [appearance configureWithOpaqueBackground];
        appearance.backgroundImage = bgImage; 
//此处变化---修改mode---->>>>>
        [appearance setBackgroundImageContentMode:UIViewContentModeTop];
//<<<--------变化结束
        self.navigationBar.standardAppearance = appearance;
        self.navigationBar.scrollEdgeAppearance=self.navigationBar.standardAppearance;
        }
//原来写的也要保留
[self.navigationBar setBackgroundImage: bgImage forBarMetrics:UIBarMetricsDefault];

好的看下结果:


251640833521_.pic.jpg

图片超出并有遮挡,裁剪一下多余部分(其他的mode我试了,都不是我要的就不放截图了)。

第三次修改

UIImage *bgImage = [UIImage imageNamed:@"你的图片name"];
//判断系统
    if (@available(iOS 13.0, *)) {
        UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
        [appearance configureWithOpaqueBackground];
        appearance.backgroundImage = bgImage; 
        self.navigationBar.standardAppearance = appearance;
        self.navigationBar.scrollEdgeAppearance=self.navigationBar.standardAppearance;
        }
//原来写的也要保留
    [self.navigationBar setBackgroundImage: bgImage forBarMetrics:UIBarMetricsDefault];
//此处变化----增加裁剪--->>>>>
     self.navigationBar.clipsToBounds = YES;
//<<<--------变化结束

好的看下结果:


271640834730_.pic.jpg

超出部分被裁剪,但是顶部的也被剪掉了,并不是我要的,只裁剪超出bar底部的部分。

第四次修改

    UIImage *bgImage = [UIImage imageNamed:@"你的图片name"];
//先判断下系统
    if (@available(iOS 13.0, *)) {
        UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
        [appearance configureWithOpaqueBackground];
        CGFloat h = 你想裁剪的高度;//记得适配头发帘屏
//此处变化----增加自由裁剪--->>>>>
        CGImageRef part = CGImageCreateWithImageInRect(bgImage.CGImage,CGRectMake(0, 0, bgImage.size.width, h));
        UIImage *back = [UIImage imageWithCGImage:part];
//这句要写,CGImageCreateWithImageInRect是c的方法要注意内存泄漏
        CGImageRelease(part);
//<<<--------变化结束
        appearance.backgroundImage = back; 
        self.navigationBar.standardAppearance = appearance;
        self.navigationBar.scrollEdgeAppearance=self.navigationBar.standardAppearance;
        }
//原来写的也要保留
     [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"你的图片name"] forBarMetrics:UIBarMetricsDefault];
//此处变化----取消增加裁剪--->>>>>
     //self.navigationBar.clipsToBounds = YES;
//<<<--------变化结束

好的看下结果:


231640833520_.pic.jpg

右侧的气泡没有了,应该是裁剪区域有问题

第五次修改

    UIImage *bgImage = [UIImage imageNamed:@"你的图片name"];
//先判断下系统
    if (@available(iOS 13.0, *)) {
        UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
        [appearance configureWithOpaqueBackground];
//此处变化----改变裁剪区域--->>>>>
        CGFloat h = 你想裁剪的高度;//记得适配头发帘屏
//CGImageCreateWithImageInRect 是C的函数,使用的坐标都是像素
//在iOS中使用的都是点坐标
//所以在高分辨率的状态下加载了@2x或@3x的图片,而CGImageCreateWithImageInRect还是以@1x的尺寸去进行裁剪,最终只裁剪了部分尺寸的内容
//[UIScreen mainScreen].scale -> 获取当前屏幕坐标与像素坐标的比例
        CGImageRef part = CGImageCreateWithImageInRect(bgImage.CGImage, CGRectMake(0, 0, bgImage.size.width * [UIScreen mainScreen].scale, h * [UIScreen mainScreen].scale));
//<<<--------变化结束
        UIImage *back = [UIImage imageWithCGImage:part];
//这句要写,CGImageCreateWithImageInRect是c的方法要注意内存泄漏
        CGImageRelease(part);

        appearance.backgroundImage = back; 
        self.navigationBar.standardAppearance = appearance;
        self.navigationBar.scrollEdgeAppearance=self.navigationBar.standardAppearance;
        }
//原来写的也要保留
     [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"你的图片name"] forBarMetrics:UIBarMetricsDefault];
//此处变化----取消增加裁剪--->>>>>
     //self.navigationBar.clipsToBounds = YES;
//<<<--------变化结束

好的看下结果:


221640833520_.pic.jpg

修改完成,有没有不用裁剪的方法呀。

你可能感兴趣的:(iOS15下导航栏(Navi)背景图消失)