在有的时候,当一个ViewController被push进一个NavigationController的时候,view上会有一个高度为64的NavigationBar(除非主动隐藏了NavigationBar)。

那么在ViewController的view上布局的时候,Y轴的起始位置是从 Y=0 开始,还是Y=64?

这两种的情况都是会出现的,那么起始位置什么时候是0什么时候又是64呢?

首先创建一个ViewController的方法一般有三种:

  1.纯代码创建

  2.Xib创建

  3.在stroyboard上创建

  

位置是0开始还是64,其实取决于,你往view添加的组件是什么,是UIScrollView或者UIScrollView的子类还是其他的组件。

 

(一)首先往view上添加一个跟UIScrollview 没有关系的组件(以button为例)

  如果使用的是storyboard来布局的话,这个问题会相对简单点。因为在storyboard上被压入的ViewController会自动显示NavigationBar的位置

这样布局的时候自然而然的会从NavigationBar的下面开始布局,也就是Y=64,比如往上面拖一个button

这样这个button是正常显示的,不会被NavigationBar遮住,此时button的Y轴是64。所以基本可以肯定,如果使用代码写的组件也是需要从Y=64的位置开始布局。其实在storyBoard中如果将这个button继续向上托的话,这个button就会添加到Navigationbar上了。

(1)当Y=0的时候

在这种情况下,button是被NavigationBar遮住的

(2)当Y=64的时候

在Y=64的情况是正常的

(二)现在往view上添加UIScrollView的子类UITableView

还是现在storyboard上直接拖一个TableView,TableView的其实位置也放在NavigationBar的下面也就是Y = 64,。

结果在模拟器上运行的结果却和往上面添加button是不一样的

可以看出来TableView往下移,是不是TableView的Y轴位置往下移了呢?

给TableView设置一个边框发现其实并不是的TableView的Y轴位置还是64

那是是不是TableView的contentOffset发生了变化呢?于是分别在viewDidLoad,viewWillAppear,ViewDidAppear的时候打印TableView的contentOffset

 发现在viewDidAppear的时候TableView的contentOffset的Y是发生64的偏移。如果使用的ScrollView的话,情况也是一样的,在ScrollView上添加的组件都是会向下发生64的偏移。

所以按照这个情况来说那么Scrollview以及他的子类在布局的时候Y轴不是从64开始而是0,测试一下果然如此

现在看上去内容的位置是对了,但是实际上TableView还是被NavigationBar遮住了64大小的位置,但是因为内容自动往下偏移了64,所以才出现了这样的效果

(3)那如果view上既有tableView又有其他组件又是什么情况呢?

现在再往view上放一个button,给他的默认位置为64

跑一遍模拟器看看

从模拟器的结果看来位置都是正确的,看来在布局的时候TableView和button的不会相互影响的。这样的话,如果button的Y轴变成0的话,那么他应该会被NavigationBar遮住

跑一遍模拟器,果然是这样。

在布局的时候如果使用了NavigationController的时候他会对ScrollView以及他的子类进行一个修正,也就是把他的contentOffset向下偏移64,所以布局的时候除了ScrollView以及他子类之外的其他控件都需要从Y=64开始布局。其实在viewController中有一个属性叫做automaticallyAdjustsScrollViewInsets, 这个属性官方的解释简单的说就是ViewController会根据status Bar、NavigationBar、tabBar的高度对ScrollView的内容的为做出相应的调整,这个属性是IOS7.0以后的才有的。默认情况下这个属性是YES。所以在上面的TableView出现了内容下移的现象,如果想将TableView的Y轴设置从64开始,并且内容不发生偏移的话,将automaticallyAdjustsScrollViewInsets属性设置为NO就可以了。

 

(4)如果有两个或者多个的ScrollView或者他的子类的时候又是什么情况呢?

 在视图控制器上放两个TableView,将他们的Y其实位置都设置为64,那是不是这两个TableView的内容都会下移64呢?

模拟器跑下来却不是的

一个TableView的内容被自动下移了,另一个并没有,再试试放三个TableView试试

还是一样一个内容偏移了,其他的并没有。这说明automaticallyAdjustsScrollViewInsets是起来作用的,但是只在一个TableView上用,如果把automaticallyAdjustsScrollViewInsets设置为NO又是什么情况呢?

 

可以看出来第一个TableView的内容不再偏移了,所以automaticallyAdjustsScrollViewInsets在有个多个ScrollView或者他的子类的时候只会调整他们其中的一个。

 

所以具体怎么使用,还是看每个人的需要。

 

posted on 2015-08-22 22:58  不敢告诉她  阅读(2882)  评论(1编辑  收藏  举报