在使用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或者他的子类的时候只会调整他们其中的一个。
所以具体怎么使用,还是看每个人的需要。
在使用NavigationController情况下的布局的Y轴的起始位置的更多相关文章
- python 11:range(起始索引,终止索引,步数)(默认情况下步数为1,生成从起始索引,每次增加(终止索引-起始索引)/步数,到终止索引前的数字串)
squares = [] for value in range(1,11): #第三参数默认为1,生成从1开始,每次增加1步数,到11前的10为止的数字串 square = value ** 2 sq ...
- C++对象在继承情况下的内存布局
1,C++ 中继承是非常重要的一个特性,本节课研究在继承的情形下,C++ 的对象模 型又有什么不同: 2,继承对象模型(最简单的情况下): 1,在 C++ 编译器的内部类可以理解为结构体: 2,子类是 ...
- ios --xib自定义,解决在导航栏不透明的情况下,自定义xib view高度被压缩64的问题
在使用xib自定义view的时候,个人习惯性的直接使用xib中的约束,所以自然而然的要打开Autolayout.以前在使用的时候没有发现什么问题,最近项目中使用的时候突然发现在导航栏透明的情况下,出现 ...
- 排版紧凑情况下IOS 浏览器的文字部分选中问题
一.需求 一个每一项都是图文混排的列表页,在需要对其中的某一部分文字进行选中copy的时候,IOS个二货每次都是直接选中了整个列表项,无论怎么操作它的选框都没有办法做到部分选中. 这是我本周遇到遇到的 ...
- 在chrome下-webkit-box布局的一个bug
chrome,也就是webkit内核下作的检测, chrome版本是40, -webkit-box这种布局在移动端用的比较多,主要是因为pc端的浏览器内核参差不齐. 因为在写HTML的时候看上了-we ...
- EasyUI特殊情况下的BUG整理
前面有两篇: Easyui - combo[tree,box]下拉图标有间隙bug解决方法 http://blog.csdn.net/isea533/article/details/12996561 ...
- 在table中tr的display:block在firefox下显示布局错乱问题
[转自:] http://blog.csdn.net/sd2131512/article/details/4720345 按照常理,对于某一单元行需要显示时,使用:display:block属性,不需 ...
- Android手机在不同分辨率情况下字体自适应大小
两种解决方法: 一. 1.首先根据不同分辨率获取不同字体大小. 在RES里创建values-480x320/strings.xml 里面设置<dimen name="Text_size ...
- StoryBoard不使用AutoLayout情况下 按比例快速兼容适配iPhone6/6 Plus教程【转载】
StoryBoard不使用AutoLayout情况下 按比例快速兼容适配iPhone6/6 Plus教程[转] 声明:本文章是为了后期快速兼容6和6Plus的按比例放大方法,对于部分读者来说可能觉得该 ...
随机推荐
- Linux的fuser命令解析
fuser命令是用来显示所有正在使用着指定的file, file system 或者 sockets的进程信息. 例一: #fuser –m –u /mnt/usb1 /mnt/usb1: 1347c ...
- apktool反编译工具使用详解
文章转自: http://zhangyan1158.blog.51cto.com/2487362/683234 一.APKTOOL使用环境配置 1.安装JAVA并设置环境变量. 下载安装都很简单,关键 ...
- UICollectionViews有了简单的重排功能
代码地址如下:http://www.demodashi.com/demo/13213.html 一.前言 我是UICollectionView的忠实粉丝.这个类比起它的老哥UITableView类具有 ...
- IFrame和Ajax比較
说到比較,可能我是须要把这连个东西都给大家介绍一下的,可是介于大家都已经有了非常多的理解.我就简单的说了. Ajax: 是指一种创建交互式网页应用的网页开发技术.主要是利用Xm ...
- jQuery框架源码解读
1.jQuery 1.9.1 parseJSON: function( data ) { // Attempt to parse using the native JSON parser first ...
- "《 Serial Drivers 》by Alessandro Rubini" 学习笔记
Introduction to "serial device driver" (My study note) 膜拜大神的作品. Standing on the should ...
- php 实现 html转js
[php] <?php function htmltojs($str){ $re=''; $str=str_replace('\','\\',$str); $str=str_replace(&q ...
- stm32时钟设置函数
这里涉及到一个很重要的寄存器,时钟配置寄存器:RCC_CFGR #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defin ...
- CREATE SEQUENCE添加自增序列及NEXT VALUE FOR返回序列号
From :https://msdn.microsoft.com/zh-cn/library/ff878091.aspx 语法: CREATE SEQUENCE [schema_name . ] se ...
- C语言基础(20)-文件操作(fopen,getc,fclose)
一.文件操作 读文件的顺序: 1.先打开文件 2.读写文件 3.关闭文件 1.1 fopen FILE *fopen( const char *path, const char *mode ); 函数 ...