iOS UINaviagationBar/UITabBar 的 translucent 属性

简述

苹果从 iOS 7 开始使用扁平化风格开始之后,就出现了 translucent 属性。其意思就是“半透明”,所以设置这个属性的意思就是,是否支持半透明。从本身的意思上来看,这个属性并没有什么不好理解的,但是这个属性偏偏会影响我们的布局,所以我们还需要详细的理解这个属性。

应用

iOS 7 开始 translucent 属性默认值为 YES,所以 UINaviagationBar/UITabBar 默认是半透明的,此时 controller 的坐标是从屏幕顶端开始的,这个比较好理解,既然要做半透明效果,说明就是想在 UINaviagationBar/UITabBar 底部看见我们布局的控件元素,不然还不如用不透明的效果。

  1. automaticallyAdjustsScrollViewInsets属性的应用(iOS 11 之前)
    当 UINaviagationBar/UITabBar 的 translucent 属性为 YES(为 NO 的时候,不影响),如果我们使用 scrollview 类的控件时,感觉坐标却没有从屏幕顶端开始。这就是因为 Controller 的 automaticallyAdjustsScrollViewInsets 属性默认值为 YES。意思就是自动调整scrollview 类的内边距。所以感觉没有从屏幕顶端开始布局,但其实还是从屏幕顶端开始布局,只是系统底层自动的调整了内边距(contentOffset)。如果我们设置为 NO,则系统不会调整内边距,这时就可以看到 TableView 会被遮挡。
    • 注意点:从 iOS 11 开始 ,这个方法就失效了(设置与否都不影响)。
  @property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets 
  API_DEPRECATED("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0)); 
  // Defaults to YES
  1. contentInsetAdjustmentBehavior 属性的应用
    从 iOS 11 开始,可以使用contentInsetAdjustmentBehavior 属性来代替automaticallyAdjustsScrollViewInsets,contentInsetAdjustmentBehavior 有4种类型

    • UIScrollViewContentInsetAdjustmentAutomatic: 与 scrollableAxes 相似,但为了向后兼容依然会对navigationController里的且设置或者默认为automaticallyAdjustsScrollViewInsets = YES 的scrollView来调整 top 和 bottom 的内边距(contentInset),无论是否设置了scrollView的可滑动属性 scrollable。
    • UIScrollViewContentInsetAdjustmentScrollableAxes:只有当 ScrollView 可以滑动时,才会自动的调整内边距(contentInset)(例如:contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)
    • UIScrollViewContentInsetAdjustmentNever: 内边距(contentInset) 始终都不会被调整。
    • UIScrollViewContentInsetAdjustmentAlways: 内边距(contentInset) 始终会被scrollView 的 safeAreaInsets 来调整。
  2. extendedLayoutIncludesOpaqueBars 属性的应用
    这个属性的意思是:扩展布局是否包含不透明的 UINaviagationBar/UITabBar,默认值是 NO。因为当 translucent = NO 时,controller 的坐标是从 UINaviagationBar 底部开始和 UITabBar 顶部开始的,如果我们也想从屏幕顶部开始,则可以设置 extendedLayoutIncludesOpaqueBars = YES 。

  3. edgesForExtendedLayout 属性的应用
    这个属性的意思是控制界面布局距离屏幕的内边距,默认值是 UIRectEdgeAll,也就是全屏布局。

当 TabBarController 中的 TabBar 设置 translucent = YES时,在 iOS 12.1 下 Navigation 使用了 hidesBottomBarWhenPushed = YES,pop 回来的时候 TabBar 位置偏移(布局异常)

具体的情况如下(gif 图省去了其它部分,只截取了 TabBar 部分):


布局异常.gif
  • 原因:这个是 iOS 12.1 系统问题引起的布局问题。
  • 解决方案:
    • [[UITabBar appearance] setTranslucent:NO]; 将 Tabbar 的 translucent 设置为 NO。
    • 如果想保留 translucent = YES,可以参考这篇文章:https://github.com/ChenYilong/iOS12AdaptationTips/issues/3 。

你可能感兴趣的:(iOS UINaviagationBar/UITabBar 的 translucent 属性)