一 抛砖引玉
在iOS的开发中,当TableView遇到导航栏后自动下移的解决方案:
1.self.automaticallyAdjustsScrollViewInsets = NO;// 默认是YES
2.self.edgesForExtendedLayout = UIRectEdgeNone;// 推荐使用
3.self.navigationController.navigationBar.translucent = NO; // 默认是YES
很多开发者都很熟悉这几句简单的代码,都知道TableView遇到导航栏后自动下移怎么解决。真正的大牛应该是掌握知识点,知道运用其能解决什么问题,做出什么效果,而不是纯粹的copy。
二 庖丁解牛
iOS7开始,你有几种方式常见的方式去操作控制器view的布局(控制器就默认添加了全屏属性)
- edgesForExtendedLayout (默认的值UIRectEdgeAll)
- automaticallyAdjustsScrollViewInsets (默认值YES)
- contentInsetAdjustmentBehavior (UIScrollView属性)
- extendedLayoutIncludesOpaqueBars (默认值NO)
- edgesForExtendedLayout
字面含义:控制器view的铺满样式,指定边缘要延伸的方向,默认UIRectEdgeAll是延伸到整个屏幕的高度,即使有上有navigationBar,下有tabBar;UIRectEdgeNone是view从navigationBar下tabBar上开始平铺,即不透过导航栏和tabBar。
当edgesForExtendedLayout值为UIRectEdgeAll时:
![](https://img.haomeiwen.com/i2546201/b6172cd7569f1910.jpg)
当edgesForExtendedLayout值为UIRectEdgeNone时:
![](https://img.haomeiwen.com/i2546201/175eeef606b83565.jpg)
- automaticallyAdjustsScrollViewInsets和contentInsetAdjustmentBehavior
字面含义:视图里面存在唯一一个UIScrollView或其子类View,那么它会自动设置相应的内边距,决定scroll是否占据整个视图。
automaticallyAdjustsScrollViewInsets默认值是YES,contentInsetAdjustmentBehavior默认值是UIScrollViewContentInsetAdjustmentAutomatic,即默认是有内边距的。
温馨小提示:automaticallyAdjustsScrollViewInsets在iOS11已废除,需要设置contentInsetAdjustmentBehavior才生效,为了兼容iOS11,偷懒的程序员都会扩展一个属性如autoAdjustsScrollViewInsets内部再根据系统判断设置哪个。
当automaticallyAdjustsScrollViewInsets默认值是NO(iOS11:contentInsetAdjustmentBehavior默认值是UIScrollViewContentInsetAdjustmentAutomatic)时:
![](https://img.haomeiwen.com/i2546201/08296e5ef459cb11.jpg)
![](https://img.haomeiwen.com/i2546201/8e33cd2bb496e6bd.jpg)
- extendedLayoutIncludesOpaqueBars
字面含义:是否延伸到包含不透明的状态栏,默认值是NO。苹果的状态栏(status bar)是透明的。如果状态栏不透明,这个试图就不回扩展到不透明的状态栏底部,除非将其值设置为YES。
温馨小提示:如果状态栏不透明,即使你设置edgesForExtendedLayout 为 UIRectEdgeAll,extendedLayoutIncludesOpaqueBars为NO(默认如此),view不会延伸到状态栏底部的
三 灵活应用
-
需求一:滚动视图view从导航栏底部开始,但是在滑动时,让其穿透到导航栏的底部
-
需求二:滚动视图view从导航栏底部开始,在滑动时,不让其穿透到导航栏底部
-
需求三:等等,业务往往有很多种不同的需求
针对需求一只需将edgesForExtendedLayout设置为UIRectEdgeAll且automaticallyAdjustsScrollViewInsets(或者contentInsetAdjustmentBehavior为UIScrollViewContentInsetAdjustmentAutomatic)为YES即可。
针对需求二将edgesForExtendedLayout设置为UIRectEdgeNone即可
虽然内容很简单,但要掌握其原理,才能应付各种需求,学无止境,只有不断学习,程序员才有立足之地。
网友评论