最近用测试机发现push后顶部导航栏的背景图消失。
搜集了资料后从ios13开始UINavigationBarAppearance需要设置,但在在ios15强制执行了,所以15上会出现问题。
出现问题:
希望的样子:
第一次修改
那么针对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];
好的看下结果:
图片被压缩了并不是我要的,改下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];
好的看下结果:
图片超出并有遮挡,裁剪一下多余部分(其他的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;
//<<<--------变化结束
好的看下结果:
超出部分被裁剪,但是顶部的也被剪掉了,并不是我要的,只裁剪超出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;
//<<<--------变化结束
好的看下结果:
右侧的气泡没有了,应该是裁剪区域有问题
第五次修改
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;
//<<<--------变化结束
好的看下结果: