一. tabbar背景颜色/字体颜色
-
改变tabbar的
选中的item的字体颜色,和未选中的item的字体颜色:self.tabbar.tintColor = [UIColor redColor];self.tabbar.unselectedItemTintColor = [UIColor yellowColor]; -
改变tabbar的
背景颜色,方法1:self.tabBar.barTintColor = .blue self.tabBar.backgroundColor = .blue -
改变tabbar的
背景颜色,方法2:self.tabBar.backgroundImage = UIImage.withColor(.red) self.tabBar.backgroundColor = .blue -
改变tabbar的
背景颜色,方法3:if #available(iOS 13, *) { let appearance = self.tabBar.standardAppearance.copy() //appearance.shadowImage = UIImage.withColor(.yellow)///设置阴影 //appearance.shadowColor = .yellow///设置阴影 appearance.backgroundImage = UIImage.withColor(.yellow) appearance.backgroundColor = .yellow appearance.backgroundEffect = nil////这句话非常重要,在不动.translucent属性前提下,设置纯背景颜色,特别是设置tabbar透明,非常重要 self.tabBar.standardAppearance = appearance if #available(iOS 15.0, *) { ///用这个方法的,这个一定要加,否则15.0系统下会出问题,一滑动tabbar就变透明!!! self.tabBar.scrollEdgeAppearance = appearance } else { } } -
总结:
-
方法1或者方法2中的属性设置,一定要成对出现!!!如果只设置backgroundImage/barTintColor或者只设置backgroundColor,一滑动tabor就会变透明 - 使用
方法3:- 如果不适配ios 15.0,也就是不加上
self.tabBar.scrollEdgeAppearance = appearance,也会出现一滑动控制器,tabbar变透明 - 如果是
tabbar背景透明,方法3一定要加上appearance.backgroundEffect = nil。加上这句,就取消tabbar的毛玻璃效果了。
- 如果不适配ios 15.0,也就是不加上
-
-
不得不骂一句,操蛋的苹果,改个背景颜色,要几个属性组合使用,不同的组合适配不同的系统版本,一个不小心就是掉坑里了!!!
二. navigationBar背景颜色/字体颜色
- 改
navigationBar的字体颜色:let appearance = UINavigationBarAppearance() appearance.backgroundColor = bgcolor appearance.shadowColor = .clear///下划线颜色 appearance.backgroundEffect = nil////如果要设置背景透明,这句话非常重要 appearance.titleTextAttributes = [.foregroundColor:titleColor,.font:UIFont.systemFont(ofSize: 18)] self.navigationController?.navigationBar.standardAppearance = appearance self.navigationController?.navigationBar.scrollEdgeAppearance = appearance - 关于
tabbar和navigationBar的scrollEdgeAppearance的区别:-
- 两个
appearance都继承同一个类UIBarAppearance。而UIBarAppearance四个决定背景颜色的属性和阴影的属性就是:
/// A color to use for the bar background. This color is composited over backgroundEffects. @NSCopying open var backgroundColor: UIColor? /// An image to use for the bar background. This image is composited over the backgroundColor, and resized per the backgroundImageContentMode. open var backgroundImage: UIImage? /// The content mode to use when rendering the backgroundImage. Defaults to UIViewContentModeScaleToFill. UIViewContentModeRedraw will be reinterpreted as UIViewContentModeScaleToFill. open var backgroundImageContentMode: UIView.ContentMode /// A color to use for the shadow. Its specific behavior depends on the value of shadowImage. If shadowImage is nil, then the shadowColor is used to color the bar's default shadow; a nil or clearColor shadowColor will result in no shadow. If shadowImage is a template image, then the shadowColor is used to tint the image; a nil or clearColor shadowColor will also result in no shadow. If the shadowImage is not a template image, then it will be rendered regardless of the value of shadowColor. @NSCopying open var shadowColor: UIColor? /// Use an image for the shadow. See shadowColor for how they interact. open var shadowImage: UIImage? - 两个
-
-
tabar的scrollEdgeAppearance是15.0后有的
而navigationBar的scrollEdgeAppearance是13.0后有的:
/// Describes the appearance attributes for the tabBar to use when an observable scroll view is scrolled to the bottom. If not set, standardAppearance will be used instead. @available(iOS 15.0, *) @NSCopying open var scrollEdgeAppearance: UITabBarAppearance? @available(iOS 13.0, *) @NSCopying open var scrollEdgeAppearance: UINavigationBarAppearance? -
- 如果
采用赋值standardAppearance改变背景颜色,无论tabbar和还是navigationBar都要设置scrollEdgeAppearance,否则就会出现滑动变透明的问题。
- 如果
- 4 如果要设置
tabbar和navigationBar的背景透明,不要去搞什么.translucent=true/false,这个属性一动就影响左上角y值的起点位置,影响全局布局。设置appearance.backgroundEffect = nil就可以了。
-
三。.translucent 属性干了什么
- 是
YES的时候,tabbar的视图层级是
UITabBar-->UIBarBackground-->UIVisualEffectView-->UIVisualEffectBackdropView-->UIVisualEffectSubview-->UIVisualEffectSubview (决定tabbar颜色的视图) - 是
NO的时候,tabbar的视图层级是
UITabBar-->UIBarBackground-->UIImageView (决定tabbar颜色的视图) -
YES还是NO,从颜色效果上,我没看出区别 - translucent = NO 对UICollectionView截屏的影响,具体见第十一条
- 使用
方法1和方法2的时候,视图层级和self.tabbar.translucent = NO一摸一样,都是3层 - 改变
tabbar的背景颜色,又看到下面这个方法
这个方法只是改变tabbar部分的背景颜色,tabbar到底部的安全区UIView *color_view = [[UIView alloc]initWithFrame:self.tabBar.bounds]; color_view.backgroundColor = [UIColor redColor]; [self.tabBar insertSubview:color_view atIndex:0];safeArea有一条是改变不了的。比如使用上面的方法设置tabbar为redcolor,tabbar下面的安全区有一条留白。