设置导航栏透明遇到的问题

控制rootView布局的几个属性

UINavigationBar的translucent

1.该属性iOS7之前就有,默认值是YES,导航栏为半透明
2.translucent为YES时,rootView从(0,0)开始布局,会被导航栏挡住
3.translucent为NO时,从导航栏下面开始布局

UIViewController的edgesForExtendedLayout

1.iOS7开始才有,默认值时UIRectEdgeAll,rootView从(0,0)开始布局,会被导航栏挡住
2.设置为UIRectEdgeNone,从导航栏下面开始布局
ps:当我们设置导航栏为半透明时,即translucent为NO时,即使此时edgesForExtendedLayout是UIRectEdgeAll,也会从导航栏下面开始布局,不过在这种情况下,我们可以设置UIViewController的extendedLayoutIncludesOpaqueBars为NO。下面我们会讲解UIViewController的extendedLayoutIncludesOpaqueBars属性

UIViewController的extendedLayoutIncludesOpaqueBars

1.iOS开始才有,默认值是NO,意思是在不透明的导航栏下也全屏显示
2.通过将此属性值设置为YES时,解决即使导航栏不透明也从(0,0)开始布局,会被导航栏挡住

UIViewController的automaticallyAdjustsScrollViewInsets

1.iOS7开始才有,如果视图里面存在唯一一个UIScrollView或其子类,那么它会自动设置相应的内边距inset,这样可以让scrollView占据整个视图,又不会让导航栏、tabBar遮挡,会根据所在界面的状态栏、导航栏、tabBar的高度,自动调整scrollView的inset
2.如果视图中存在多个scrollView或其子类,automaticallyAdjustsScrollViewInsets只会对栈顶控制器管理的第一个scrollView起作用

UIScrollView的contentInsetAdjustmentBehavior

1.iOS11之后,替代automaticallyAdjustsScrollViewInsets。

总结:
1.iOS7以后translucent默认为YES,rootView从(0,0)开始布局,修改edgesForExtendedLayout属性可以改变布局
2.translucent为NO,rootView从导航栏底部开始布局,修改edgesForExtendedLayout属性无法改变,可以通过设置extendedLayoutIncludesOpaqueBars为YES使得从(0,0)开始布局
2.automaticallyAdjustsScrollViewInsets默认值是YES,表示在全屏模式下会自动修改第一个添加到rootView的scrollView的contentInset为(64,0,0,0),在iPhoneX为(88,0,0,0)用来调整scrollView在全屏模式下的显示,为可以设置NO,不自适应,而是按照自己设置的显示
3.设置UINavigationBar的背景图片可以改变导航栏背景色,如果背景图片包含alpha的色值,系统会默认将translucent设置为YES,没有包含alpha色值会将translucent设置为NO,不过这是针对没有手动设置translucent的情况,如果我们设置了translucent,那么系统就不会根据背景图片的alpha来修改translucent

你可能感兴趣的:(设置导航栏透明遇到的问题)