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

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

在使用NavigationController情况下的布局的Y轴的起始位置的更多相关文章

  1. python 11:range(起始索引,终止索引,步数)(默认情况下步数为1,生成从起始索引,每次增加(终止索引-起始索引)/步数,到终止索引前的数字串)

    squares = [] for value in range(1,11): #第三参数默认为1,生成从1开始,每次增加1步数,到11前的10为止的数字串 square = value ** 2 sq ...

  2. C++对象在继承情况下的内存布局

    1,C++ 中继承是非常重要的一个特性,本节课研究在继承的情形下,C++ 的对象模 型又有什么不同: 2,继承对象模型(最简单的情况下): 1,在 C++ 编译器的内部类可以理解为结构体: 2,子类是 ...

  3. ios --xib自定义,解决在导航栏不透明的情况下,自定义xib view高度被压缩64的问题

    在使用xib自定义view的时候,个人习惯性的直接使用xib中的约束,所以自然而然的要打开Autolayout.以前在使用的时候没有发现什么问题,最近项目中使用的时候突然发现在导航栏透明的情况下,出现 ...

  4. 排版紧凑情况下IOS 浏览器的文字部分选中问题

    一.需求 一个每一项都是图文混排的列表页,在需要对其中的某一部分文字进行选中copy的时候,IOS个二货每次都是直接选中了整个列表项,无论怎么操作它的选框都没有办法做到部分选中. 这是我本周遇到遇到的 ...

  5. 在chrome下-webkit-box布局的一个bug

    chrome,也就是webkit内核下作的检测, chrome版本是40, -webkit-box这种布局在移动端用的比较多,主要是因为pc端的浏览器内核参差不齐. 因为在写HTML的时候看上了-we ...

  6. EasyUI特殊情况下的BUG整理

    前面有两篇: Easyui - combo[tree,box]下拉图标有间隙bug解决方法 http://blog.csdn.net/isea533/article/details/12996561 ...

  7. 在table中tr的display:block在firefox下显示布局错乱问题

    [转自:] http://blog.csdn.net/sd2131512/article/details/4720345 按照常理,对于某一单元行需要显示时,使用:display:block属性,不需 ...

  8. Android手机在不同分辨率情况下字体自适应大小

    两种解决方法: 一. 1.首先根据不同分辨率获取不同字体大小. 在RES里创建values-480x320/strings.xml 里面设置<dimen name="Text_size ...

  9. StoryBoard不使用AutoLayout情况下 按比例快速兼容适配iPhone6/6 Plus教程【转载】

    StoryBoard不使用AutoLayout情况下 按比例快速兼容适配iPhone6/6 Plus教程[转] 声明:本文章是为了后期快速兼容6和6Plus的按比例放大方法,对于部分读者来说可能觉得该 ...

随机推荐

  1. Android 之UI自适应解决方式

    1.概况 作为Android开发者,最头疼的莫过于让自己开发的程序在不同终端上面的显示效果看起来尽量一致(当然.假设要充分利用大屏幕的优势另当别论).在全球范围内来讲.android有着数以亿计的设备 ...

  2. poj 2409 Let it Bead Polya计数

    旋转能够分为n种置换,相应的循环个数各自是gcd(n,i),个i=0时不动,有n个 翻转分为奇偶讨论,奇数时有n种置换,每种有n/2+1个 偶数时有n种置换,一半是n/2+1个,一半是n/2个 啃论文 ...

  3. Java常见分页方式

    1. 网站常见分页样式 采用传统的分页方式(邮件列表),可以明确的获取数据信息,如有多少条数据 分多少页显示等 采用下拉式的分页样式(QQ空间),一般无法获取明确的数据数量相关的信息,但是在分页操作之 ...

  4. 用户自定义类型《lua程序设计》 28章 笔记

    本实例实现一种很简单的类型------布尔数组.C语言可以实现将每个布尔值存储在一个bit中,从而减少内存用量. 必须的一些宏 Code Snippet #defineBITS_PER_WORD (C ...

  5. 使用svn hooks 脚本post-commit时遇到的故障

    由于网站上线,需要把新添加功能上传到测试环境进行测试,但由于程序员每天有大量的修改,如果总是登陆服务器手动更新svn工作副本(测试环境)太耗时耗精力,进而增加svn进行commit时,测试环境即时更新 ...

  6. 转: Your build settings specify a provisioning profile with the UUID, no provisioning profile was found

    http://blog.csdn.net/rbyyyblog/article/details/12220875 在Archive项目时,出现了“Your build settings specify ...

  7. silverlight RadGridView总结系列(转载)

    系列一. RadGridView常用属性总结    1.不可编辑----IsReadOnly="True".    2.不自动增加行----AutoGenerateColumns= ...

  8. JAVA方法传递参数:传值?传引用?

    先来看下面这三段代码: //Example1: public class Example1 { static void check(int a) { a++; } public static void ...

  9. DMA (直接存储器访问)

    DMA (直接存储器访问) 编辑 DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载.否 ...

  10. FPGA和DSP间基于SRIO的高速通信系统设计

    作者:陈婷,岳强,汪洋 解放军信息工程大学 摘要: 现代信号处理系统通常需要在不同处理器之间实现高速数据通信,SRIO协议由于高效率.低延时的特性被广泛使用.本文研究了在FPGA和DSP两种处理器之间 ...