zoukankan      html  css  js  c++  java
  • 在使用NavigationController情况下的布局的Y轴的起始位置

    在有的时候,当一个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或者他的子类的时候只会调整他们其中的一个。

     

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

     

  • 相关阅读:
    随机数表示方法
    何时用重定向何时用转发
    http中重定向和请求转发
    Java正则表达式
    自定义圆形的ProgressBar
    Android内存管理机制
    Android 安全机制
    8位颜色值的含义
    Shape使用
    Bitmap(三)
  • 原文地址:https://www.cnblogs.com/small-octopus/p/4746411.html
Copyright © 2011-2022 走看看