美文网首页适配
iOS15下导航栏(Navi)背景图消失

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

作者: 六两 | 来源:发表于2021-12-30 14:01 被阅读0次

    最近用测试机发现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)背景图消失

        本文链接:https://www.haomeiwen.com/subject/wqjiqrtx.html