iOS 7 适配
注意没,是与statusBar重叠了。
下面我们做一些修改,修改AppDelegate中的window的rootViewController值:
这样与我们iOS6与以前的坐标不一样了,以前是从Navigation Bar底部开始计算y值的,现在却是从Status Bar开始计算y值。
不要着急,苹果公司有解决方案:将下面代码放在viewDidLoad中
如果底部有Tab Bar的情况呢,如果要兼容以前的frame设置,那么就需要设置UIViewController的edgesForExtendedLayout为UIRectEdgeNone。
如果我们的代码没有用storyboard, 没有用xib,纯代码的情况,如果要适配iOS7,那么上面只是介绍了有Navigation Bar, Tool Bar的情况,如果只是单纯的View,那么我们的代码运行在iOS7上,会有向上20px偏移,这需要手动修改:
新建一个UIViewController的子类,叫TestViewController,选中创建xib文件 然后,在在AppDelegate中将window的rootViewController换成我们新建的TestViewController实例,代 码如下:
如果你的程序view全是xib,没有用代码生成,那么这儿还有一种解决方法,()条件是xib中没有开启autolayout)不用代码控制self.view.bounds,所以我们先将viewDidLoad中的
小结: 从iOS7以前的工程适配到iOS7,且没有用autolayout,
运行程序效果:
可以看到是垂直方向上距status bar底部是45px,距右边是186px.
现在我们用xcode5打开这个工程。会提示Upgrade storyboard,我们点击Upgrade. Upgrade后,你会发现,垂直方向上有变化了,约束是从顶部开始,不是从status bar底部开始计算。这也我们想要的结果不一样,我们还是希望约束是从status bar底部开始计算。
仔细看看storyboard中的View Controller, 你会发现,这儿多了两个东东,分别是Top Layout Guide,Bottom Layout Guide.?
选在我们的button,按住control键,然后拖到Top Layout Guide上,在弹出的对话框选择Vertical spacing
这样又建立了一个垂直约束,你会发现这个约束是从Status bar底部开始计算的。这个约束有点像是我们需要的,?
但是这个约束距status bar是25px,我们想要的是45px. 那只需要修改一下,将25px改为45px?
你会发现有storyboard中有红色提示,这说明约束条件发生了冲突,因为垂直约束的值都为45,显示冲突了。由于我们只需要status bar底部开始计算的那个约束,所以我们将旧的那个删掉即可。?
现在分别选择iOS6/iOS7来运行。都是距status bar下面45px显示button. 适配工程完成。
顺便介绍一下xcode5中,用xib或storyboard布局的时候,preview iOS7与iOS7以前版本的效果。 快捷键:option+command+enter 打开Assistant editor,然后选择右边的automatic->preview->xxxxx(preview)
然后在出现的画面下面有一个切换iOS7与以前版本的切换开关
这样可以方例你实时的查看布局效果以适配不同版本的iOS.
最后: auto layout是好东西,虽然只有>iOS6的版本才支持,但是我还是建意大家用auto layout,因为以后苹果也可能出现多种屏幕,到时候代码修改量将会减少。
参考:https://developer.apple.com/library/ios/qa/qa1797/_index.html