iOS UINaviagationBar/UITabBar 的
简述
苹果从 iOS 7 开始使用扁平化风格开始之后,就出现了 translucent
属性。其意思就是“半透明”,所以设置这个属性的意思就是,是否支持半透明。从本身的意思上来看,这个属性并没有什么不好理解的,但是这个属性偏偏会影响我们的布局,所以我们还需要详细的理解这个属性。
应用
iOS 7 开始 translucent
属性默认值为 YES,所以 UINaviagationBar/UITabBar 默认是半透明的,此时 controller 的坐标是从屏幕顶端开始的,这个比较好理解,既然要做半透明效果,说明就是想在 UINaviagationBar/UITabBar 底部看见我们布局的控件元素,不然还不如用不透明的效果。
-
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
-
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 来调整。
-
-
extendedLayoutIncludesOpaqueBars
属性的应用
这个属性的意思是:扩展布局是否包含不透明的 UINaviagationBar/UITabBar,默认值是 NO。因为当 translucent = NO 时,controller 的坐标是从 UINaviagationBar 底部开始和 UITabBar 顶部开始的,如果我们也想从屏幕顶部开始,则可以设置 extendedLayoutIncludesOpaqueBars = YES 。 -
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 。