IOS7的一个小改变
2013-12-14 21:57
155 查看
这段时间一直忙着项目中功能点的实现,对界面上的东西没有过多的注意,昨天我把美工刚给我设计好的界面拿过来,打算调整一下程序的界面,我发现了一个问题……
好了,不罗嗦了,进入主题
因为我这个界面主要是用来展示图书列表的,因此上满加了一个scrollView,这样可以展示多于一屏的界面,当我按照美工设计的尺寸往scrollView上加图的以后,每次运行发现图片在scrollView上的显示都有向下一段像素的偏移,我仔细的检查了一遍又一遍的代码,也没有发现问题。我刚开始想的是图片的偏移是不是因为那里更改了scrollView的contentOffset属性被修改了,我查找了代码中这个属性,结果没发现。经过断点调试,我从堆栈里的信息里发现从程序运行开始到执行到断点之前,系统已经执行了很多功能,从里面我发现NavigationController,做了很多事情,再看界面,这个界面上面确实有NavigationBar的存在,我目测一下,下移的高度和NavigationBar+statuBar的高度,我从创建到最后执行这段代码这两处分别都打印了scrollView.contentOffset.y的值,结果发现没变!这更让我无法接受了!!明明是下移了,但是为什么打印出来没有改变呢?
我用了刚学的一个监测系统内部变量状态变化的方法:就是在创建scrollView的同时新建立一个线程,来不断的监听scrollView.contentOffset.y的值从建立到最终加到屏幕上后这段时间内的变化,结果我发现打印的结果是0.0--64.0--0.0!这说明系统默认对scrollView.contentOffset.y做了64个像素的偏移,这让我不能理解了。这是为什么呢?我又仔细查找了scrollView的相信介绍,发现加在scrollView上的view的显示同时受到以下三个属性的限制:contentOffset,contentSize和contentInset这三者的限制,前两个属性我们都知道,也一直在用,这是这第三个属性一直都没用过甚至都不知道它的存在。
经过一番查找我发现:从IOS7之后,桌面的坐标原点相对以前发生了变化,在IOS7以前的系统,如果界面上加了statuBar后,坐标原点会相对原来的(0,0)下移至(0,20),如果界面上再同时出现了NavigationBar之后坐标原点就会下移到(0,64)的位置,这时候你打印self.view.frame的时候你会发现,他的frame会变成(0,0,320,416)。但是到了IOS7以后,就有了变化。这是因为新系统采用了完全不一样的风格,系统的各种用于导航的空间都采用了半透明的设置,这样使得用户能够透过这些控件看到它背后的东西,因此view的坐标原点一直都没有变化,但是它比较智能,为了让你少做工作,它把scrollView.contentInset做了一个便宜,如果界面上有statuBar存在它就将scrollView.contentInset.top设置为20,如果还有NavigationBar那就设置为64,这样使得contentSize这个框向下移动了指定的像素,移动好以后,又把contentOffset的属性设置为(0,0),好像什么也没发生一样。
总结一下:IOS7系统以后,view的定点一直都在左上角,不管界面是不是有状态栏和导航栏。还有就是如果有状态栏或者导航栏,你在使用scrollView的时候,它会很智能的讲内部试图向下做个偏移。(我觉得他这种智能是多余的,还是让我们自己做好了)
当然这只是我个人的拙见,如果牛人路过发现有什么不对的地方,还请帮忙给指出来,谢谢了!
好了,不罗嗦了,进入主题
因为我这个界面主要是用来展示图书列表的,因此上满加了一个scrollView,这样可以展示多于一屏的界面,当我按照美工设计的尺寸往scrollView上加图的以后,每次运行发现图片在scrollView上的显示都有向下一段像素的偏移,我仔细的检查了一遍又一遍的代码,也没有发现问题。我刚开始想的是图片的偏移是不是因为那里更改了scrollView的contentOffset属性被修改了,我查找了代码中这个属性,结果没发现。经过断点调试,我从堆栈里的信息里发现从程序运行开始到执行到断点之前,系统已经执行了很多功能,从里面我发现NavigationController,做了很多事情,再看界面,这个界面上面确实有NavigationBar的存在,我目测一下,下移的高度和NavigationBar+statuBar的高度,我从创建到最后执行这段代码这两处分别都打印了scrollView.contentOffset.y的值,结果发现没变!这更让我无法接受了!!明明是下移了,但是为什么打印出来没有改变呢?
我用了刚学的一个监测系统内部变量状态变化的方法:就是在创建scrollView的同时新建立一个线程,来不断的监听scrollView.contentOffset.y的值从建立到最终加到屏幕上后这段时间内的变化,结果我发现打印的结果是0.0--64.0--0.0!这说明系统默认对scrollView.contentOffset.y做了64个像素的偏移,这让我不能理解了。这是为什么呢?我又仔细查找了scrollView的相信介绍,发现加在scrollView上的view的显示同时受到以下三个属性的限制:contentOffset,contentSize和contentInset这三者的限制,前两个属性我们都知道,也一直在用,这是这第三个属性一直都没用过甚至都不知道它的存在。
经过一番查找我发现:从IOS7之后,桌面的坐标原点相对以前发生了变化,在IOS7以前的系统,如果界面上加了statuBar后,坐标原点会相对原来的(0,0)下移至(0,20),如果界面上再同时出现了NavigationBar之后坐标原点就会下移到(0,64)的位置,这时候你打印self.view.frame的时候你会发现,他的frame会变成(0,0,320,416)。但是到了IOS7以后,就有了变化。这是因为新系统采用了完全不一样的风格,系统的各种用于导航的空间都采用了半透明的设置,这样使得用户能够透过这些控件看到它背后的东西,因此view的坐标原点一直都没有变化,但是它比较智能,为了让你少做工作,它把scrollView.contentInset做了一个便宜,如果界面上有statuBar存在它就将scrollView.contentInset.top设置为20,如果还有NavigationBar那就设置为64,这样使得contentSize这个框向下移动了指定的像素,移动好以后,又把contentOffset的属性设置为(0,0),好像什么也没发生一样。
总结一下:IOS7系统以后,view的定点一直都在左上角,不管界面是不是有状态栏和导航栏。还有就是如果有状态栏或者导航栏,你在使用scrollView的时候,它会很智能的讲内部试图向下做个偏移。(我觉得他这种智能是多余的,还是让我们自己做好了)
当然这只是我个人的拙见,如果牛人路过发现有什么不对的地方,还请帮忙给指出来,谢谢了!
相关文章推荐
- Android在一个activity改变另一个activity的组件
- 7.1在窗口(宽300,高200)中添加一个面板,面板的背景色为绿色,窗口在屏幕中央,不允许改变其大小,关闭窗口时程序结束运行
- 写一个方法进行各种属性的更新,而不要每个界面设置改变都改变一个属性。就是点击应用或确定按钮时调用这个更新属性的方法,遍历所有(控制对象属性的)界面控件的状态(值),进行属性修改和刷新。
- javasript dom 中获取元素类名 或者 改变类 引用另外一个类
- 当2个textview互换文字内容时,若一个textview的内容为空,2者交换时ui不能及时改变
- 两个DropDownList在DataGrid里,后一个随着前一个改变而改变
- 【远程调用框架】如何实现一个简单的RPC框架(四)优化二:改变底层通信框架
- 犯了一个改变代码格式的错误
- 我们创造世界的过程也是一个我们如何思考的过程,要想改变世界,必须先改变我们的思想
- 根据产品写的一个可拖拽的,可改变大小的小型插件
- 一个关于MFMessageComposeViewController的ios7中的诡异问题 收件人视图黑色 和解决方式
- 一个厨师的前半生后半生在阿里改变
- ios开发同一个版本多次提交不想改变版本号的解决方法
- 区区一个牌子,能否改变国运?
- 在使用PagerSlidingTabStrtip时在tab滑动到一个位置,相应的标题文字颜色也会改变
- 初识linux chmod命令/函数时我就产生一个有趣疑问:既然chmod可以改变权限, 那即使某用户原来没有某文件的权限, 也可以自己添加权限啊!
- 在c#中如何动态改变iframe的src值,动态指向一个网页
- ios7的UITableView使用AutoLayout的一个坑
- EXTJS4:如何改变grid某一个单元格的背景颜色
- hdu4467|zoj3742改变一个点影响到它周围的线路属性,询问整张图某属性的值(重点,轻点)