translucent
edgesForExtendedLayout
extendedLayoutIncluedsOpaqueBars
automaticallyAdjustScrollViewInsets
| contentInsetAdjustmentBehavior
1.translucent
来由:iOS7 导航栏增加了translucent
(半透明)效果.
默认值:YES
,体现为毛玻璃效果,可以看到下边的视图.如果设置为NO
,导航栏颜色为白色.
影响:导航栏颜色的设置 和 ViewController
下控件的布局; 同时,对于导航栏的颜色/背景图的设置,也会影响这个属性
iOS中关于透明度的属性:
transparent
全透明. UINavigationBar
和UIView
均不具备这个属性
opaque
不透明.BOOL
值. UIView
的属性, 不会影响导航栏的透明效果
alpha
透明度. float
值. UIView
有这个属性,颜色值也会有这属性,所有说alpha
值的时候,要区分是说控件的透明度还是颜色值的alpha
通道
opacity
透明度. float
值. CALayer
的属性. View.alpha = CALayer.opacity
2.edgesForExtendedLayout
来由: iOS7 ViewController
默认使用 full-Screen 布局,也就是说ViewController
的大小 和屏幕大小一致.
但是开发者可以通过ViewController
的edgesForExtendedLayout
属性来调整,是否让ViewController
延伸到屏幕边缘.
使用场景:该特性主要是处理,当前界面有导航栏或者tabBar
时,ViewController
的显示区域问题,例如设置edgesForExtendedLayout
为UIRectEdgeNone
时,则ViewController
不会被导航栏和tabBar
所遮挡.
默认值为:UIRectEdgeAll
注意点:只有当ViewController
被嵌到别的container view controller
中时才会起作用,例如UINavigationController
3.extendedLayoutIncluedsOpaqueBars
来由:iOS 7启用,在导航栏不透明时,调整ViewController
与屏幕的对齐方式. 当导航栏为不透明时,发现ViewController
顶部没有与屏幕顶部对齐,即便设置edgesForExtendedLayout
为UIRectEdgeAll
或者 UIRectEdgeTop
也没有作用,这个时候就需要启用extendedLayoutIncluedsOpaqueBars
属性
默认值为NO
使用场景: 当导航栏为不透明时,想要通过edgesForExtendedLayout
调整ViewController
与屏幕的对齐方式时,需要 使用这个属性(设置为YES
)
4.automaticallyAdjustScrollViewInsets
| contentInsetAdjustmentBehavior
来源:automaticallyAdjustScrollViewInsets
iOS 7启用,iOS 11废弃,默认值是YES
contentInsetAdjustmentBehavior
iOS 11启用,默认值UIScrollViewContentInsetAdjustmentAutomatic
. 该属性用来代替automaticallyAdjustScrollViewInsets
使用场景:
①这两个属性,都是为了解决 透明导航栏时 且scrollView
及其子类 是控制器的第一个子视图的时候,scrollView
与 UINavigationController
的对齐问题.
值得注意的是,这个时候,UINavigationController/ViewController/ScrollView
三者的顶部仍然是对齐的,与屏幕顶部保持一致.只是系统调整了 scrollView
的 contentInset
(在iOS 11及之后,表现为adjustedContentInset
)
②当导航栏为透明时,ViewController
的第一个子视图不是 ScrollView
,系统并不会调整其位置
③当导航栏被隐藏时,ViewController
的第一个视图是ScrollView
, 也会被自动调整位置
1.从translucent
说起
设置为YES
时:
①edgesForExtendedLayout
默认为 UIRectEdgeAll
②当scrollView
为ViewController
第一个子视图时,系统会调整contentInset
使其从导航栏下面显示;如果非scrollView
视图,则不会调整. 如果此时,我们想调整scrollView
的偏移量可以通过automaticallyAdjustScrollViewInsets | contentInsetAdjustmentBehavior
来设置
设置为NO
时:
edgesForExtendedLayout
默认为 UIRectEdgeLeft | UIRectEdgeRight | UIRectEdgeBottom
,不会顶部对齐.
如果 此时想要设置 ViewController
对齐屏幕顶部,可以通过extendedLayoutIncluedsOpaqueBars
当隐藏导航时,不管translucent
如何设置,对于第一个子视图是scrollView的ViewController
系统仍会调整它的偏移量
2.translucent
与 UINavigationBar.backgroundImage
的相关影响
translucent
默认是YES
①当未设置translucent
时,它的值受backgroundImage
图片像素点alpha
值的影响
使用[setBackgroundImage:forBarMetrics:]
设置背景图
如果图片中有像素点小于1,系统会推断translucent
为YES
当所有像素点alpha
值为1的时候,系统会推断translucent
为NO
.
②系统也会根据translucent
的值,也修改backgroundImage
的透明度
当translucent为YES
时,设置了一个完全不透明的图片,系统会自动修正这个图片并为它添加一个透明度,用于模拟 translucent
效果。
当translucent
为NO
时,设置了一个带有透明效果的图片,系统会在这个带有透明效果的图片背后,添加一个不透明的纯色图片用于整体效果的合成.
这个纯色图片的颜色取决于 barStyle
属性,当属性为 UIBarStyleBlack
时为黑色,当属性为 UIBarStyleDefault
时为白色,如果我们设置了 barTintColor
,则以设置的颜色为基准。
参考链接: