# UINavigation 的颜色设置,引起的吸顶效果的问题

UINavigation 的颜色设置,引起的吸顶效果的问题

1、UINavigation 的颜色设置

1.1、首先我们忽略translucent 属性,不要设置它,
我们设置navigation的颜色会很容易

//设置一个渐变颜色的navigationBar
- (void)setNavigationBarBackgroundAlpha:(float)alpha{
    UIColor *color = [UIColor colorWithWhite:1 alpha:alpha];
    UIImage *colorImage = [UIImage imageWithColor:color];
//ios 15以后新增的属性,以后设置navigationBar的颜色和字体都 要使用它了 
    if (@available(iOS 15.0, *)) {
     UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
        appearance.backgroundColor = color;//[UIColor colorWithHexString:@"#ad0225" alpha:alpha];
        appearance.shadowColor = color;//[UIColor colorWithHexString:@"#ad0225" alpha:alpha];
        [appearance setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor colorWithWhite:0 alpha:alpha]}];
        if(alpha == 0){
            self.navigationController.navigationBar.standardAppearance = nil;
            self.navigationController.navigationBar.scrollEdgeAppearance = nil;
        }else{
            self.navigationController.navigationBar.standardAppearance = appearance;
            self.navigationController.navigationBar.scrollEdgeAppearance = appearance;
        }
    }
    [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor colorWithWhite:0 alpha:alpha]}];
    [self.navigationController.navigationBar setShadowImage:colorImage];
    [self.navigationController.navigationBar setBackgroundImage:colorImage forBarMetrics:UIBarMetricsDefault];
//    [self.navigationController.navigationBar setTintColor:color];
}

1.2 UINavigationBarAppearance

apple developer

As of iOS 15, UINavigationBar, UIToolbar, and UITabBar will use their scrollEdgeAppearance when your view controller's associated scroll view is at the appropriate edge (or always if you don't have a UIScrollView in your hierarchy, more on that below)

--

You must adopt the UIBarAppearance APIs (available since iOS 13, specializations for each bar type) to customize this behavior. UIToolbar and UITabBar add scrollEdgeAppearance properties for this purpose in iOS 15.

从 iOS 15 开始,UINavigationBar、UIToolbar 和 UITabBar 将在你的VC关联滚动视图位于适当的边缘时使用 scrollEdgeAppearance
您必须使用 UIBarAppearance API 来自定义。UIToolbar 和 UITabBar 为此在 iOS 15 中添加了 scrollEdgeAppearance 属性。

** UITabBar 设计如下

if #available(iOS 15, *) {
     let appearance = UITabBarAppearance()
     appearance.configureWithOpaqueBackground()
     appearance.backgroundColor = k_FAFAFA
     UITabBar.appearance().standardAppearance = appearance
     UITabBar.appearance().scrollEdgeAppearance = UITabBar.appearance().standardAppearance
}

2.1 translucent

UINavigationBar的背景由translucent、barTintColor、backgroundImage三者共同决定,而translucent在中间起非常关键的作用,它决定了系统如何使用barTintColor和backgroundImage去设置UINavigationBar的背景效果。
1、默认值(不设置
translucent系统默认值为YES,如果既不设置为NO,也不设置为YES,即不主动调用setter方法,UINavigationBar的背景行为特性又会怎样呢?通过代码验证,结论是:
1、不主动设置translucent和主动把translucent设置为YES是不一样的,

  1. 如果设置了不透明的backgroundImage,UINavigationBar背景实际效果就是不透明的backgroundImage。此时打印translucent的值,会发现变成了NO。 这种情况也是我们最常见的情况,此时ViewController的布局其实从navigationbar 的 左下角下开始


    16398142837132.jpg
  2. 如果设置了透明的backgroundImage,打印translucent的值,会发现又变成了YES
    这种效果我们也经常见 这种ViewController的布局是从navigationBar 的左上角开始布局的

[图片上传失败...(image-13c96a-1639817019029)]
引起的问题
tableView 吸顶效果的展示会随着translucent 值的变化在跳转页面或者从后台返回前台的时候,

2、 主动设置成NO
苹果官方解析 如果设置为NO,backgroundImage若是半透明的图,则会使用barTintColor为backgroundImage创建一个不透明的背景

If you send setTranslucent:NO to a bar with a translucent custom background image 
it will provide an opaque background for the image using the bar's barTintColor if defined,
or black for UIBarStyleBlack or white for UIBarStyleDefault if barTintColor is nil.

2-1. 无论backgroundImage是nil、半透明的图,还是不透明的图,系统都会使用barTintColor来设置一个不透明的背景。且barTintColor的alpha值不起作用,一直为1。

2-2. 不透明的背景类型是_UIBarBackground,一个私有类,继承自UIView,它的背景色被设置成了barTintColor。承载backgroundImage的UIImageView是_UIBarBackground的子视图。(这里暂且不分类和实例)

2-3. 如果backgroundImage是半透明,则UINavigationBar的实际背景效果就是backgroundImage和barTintColor叠加的效果,如果是不透明,则UINavigationBar的实际背景效果就是backgroundImage。

3、主动设置成YES
3-1. 如果设置了半透明的backgroundImage,那么UINavigationBar背景实际效果就是backgroundImage的效果,如果是完全透明的图片,那UINavigationBar背景实际效果就是完全透明。

3-2. 如果设置了不透明的backgroundImage,那系统会强制将backgroundImage改为半透明,UINavigationBar背景实际效果就是backgroundImage半透明的效果;系统会强制修改的alpha = 0.909804

3-3.如果设置了backgroundImage,那barTintColor将不起任何效果。

3-4. 如果没有设置backgroundImage,那系统会使用barTintColor来设置UINavigationBar背景效果,而且带有一点模糊效果,无论barTintColor的alpha值是多少,都不起作用,会被强制修 alpha=0.85

2.2 translucent 值
  1. 如果主动设置translucent,那translucent就会一直是设置的那个值,除非再次主动设置新值。

  2. 如果不主动设置translucent,那translucent的值由backgroundImage决定,backgroundImage透明则为YES,backgroundImage不透明则为NO,如果没有backgroundImage,则一直是默认的YES。

你可能感兴趣的:(# UINavigation 的颜色设置,引起的吸顶效果的问题)