UIScrollView和导航栏的渊源

一 抛砖引玉

在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)
  1. edgesForExtendedLayout

字面含义:控制器view的铺满样式,指定边缘要延伸的方向,默认UIRectEdgeAll是延伸到整个屏幕的高度,即使有上有navigationBar,下有tabBar;UIRectEdgeNone是view从navigationBar下tabBar上开始平铺,即不透过导航栏和tabBar。

当edgesForExtendedLayout值为UIRectEdgeAll时:


UIScrollView和导航栏的渊源_第1张图片
22551521528834_.pic_thumb.jpg

当edgesForExtendedLayout值为UIRectEdgeNone时:


UIScrollView和导航栏的渊源_第2张图片
22561521529025_.pic_thumb.jpg
  1. automaticallyAdjustsScrollViewInsets和contentInsetAdjustmentBehavior

字面含义:视图里面存在唯一一个UIScrollView或其子类View,那么它会自动设置相应的内边距,决定scroll是否占据整个视图。
automaticallyAdjustsScrollViewInsets默认值是YES,contentInsetAdjustmentBehavior默认值是UIScrollViewContentInsetAdjustmentAutomatic,即默认是有内边距的。

温馨小提示:automaticallyAdjustsScrollViewInsets在iOS11已废除,需要设置contentInsetAdjustmentBehavior才生效,为了兼容iOS11,偷懒的程序员都会扩展一个属性如autoAdjustsScrollViewInsets内部再根据系统判断设置哪个。

当automaticallyAdjustsScrollViewInsets默认值是NO(iOS11:contentInsetAdjustmentBehavior默认值是UIScrollViewContentInsetAdjustmentAutomatic)时:


UIScrollView和导航栏的渊源_第3张图片
[图片上传中...(22581521531393_.pic_thumb.jpg-21a94c-1521531557869-0)]

UIScrollView和导航栏的渊源_第4张图片
22581521531393_.pic_thumb.jpg
  1. extendedLayoutIncludesOpaqueBars

字面含义:是否延伸到包含不透明的状态栏,默认值是NO。苹果的状态栏(status bar)是透明的。如果状态栏不透明,这个试图就不回扩展到不透明的状态栏底部,除非将其值设置为YES。

温馨小提示:如果状态栏不透明,即使你设置edgesForExtendedLayout 为 UIRectEdgeAll,extendedLayoutIncludesOpaqueBars为NO(默认如此),view不会延伸到状态栏底部的

三 灵活应用
  • 需求一:滚动视图view从导航栏底部开始,但是在滑动时,让其穿透到导航栏的底部

  • 需求二:滚动视图view从导航栏底部开始,在滑动时,不让其穿透到导航栏底部

  • 需求三:等等,业务往往有很多种不同的需求

针对需求一只需将edgesForExtendedLayout设置为UIRectEdgeAll且automaticallyAdjustsScrollViewInsets(或者contentInsetAdjustmentBehavior为UIScrollViewContentInsetAdjustmentAutomatic)为YES即可。
针对需求二将edgesForExtendedLayout设置为UIRectEdgeNone即可

虽然内容很简单,但要掌握其原理,才能应付各种需求,学无止境,只有不断学习,程序员才有立足之地。

你可能感兴趣的:(UIScrollView和导航栏的渊源)