现在的位置: 首页 > 综合 > 正文

iOS6,iOS7适配

2013年03月16日 ⁄ 综合 ⁄ 共 2270字 ⁄ 字号 评论关闭

收藏一篇关于iOS7,iOS6适配的文章

原文地址

iOS7可以说是苹果一次革命性的变化,这样做为一个开发者需要做的事也不少。首先苹果的view布局有所变化,现在view默认是全屏模式,而所有的bar(navigation bar, tool bar, search bars 与scope bars都是半透明),status bar则是全透明。有了这样的改变,写代码的时候就有我们折腾的了。 本文所说的适配是指:用xcode5+iOS7sdk编译的程序能正常的运行在iOS6及以下的设备上。

首先看一个例子,用xcode5创建一个Empty Application的工程, 然后新建一个继承UIViewController的类,并将这个类的一个实例做为window的rootViewController. 现在运行程序,将会看到一个空白页。 现在我们向里面加点东西。 在viewDidLoad中加入以下代码

self.view.backgroundColor = [UIColor grayColor];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(0, 0, 100, 44);
btn.layer.cornerRadius = 0;
btn.layer.borderColor = [UIColor blackColor].CGColor;
btn.layer.borderWidth = 1;
[btn setTitle:@"Test" forState:UIControlStateNormal];
[self.view addSubview:btn];
现在运行,你将会看到在屏幕最顶处有一个黑色边框的button.

注意没,是与statusBar重叠了。

下面我们做一些修改,修改AppDelegate中的window的rootViewController值:

ViewController *vc = [[ViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
self.window.rootViewController = nav;

再运行,程序,你将看到

可以看到,UIViewController的view是全屏的坐标系了。

这样与我们iOS6与以前的坐标不一样了,以前是从Navigation Bar底部开始计算y值的,现在却是从Status Bar开始计算y值。

不要着急,苹果公司有解决方案:将下面代码放在viewDidLoad中

self.edgesForExtendedLayout = UIRectEdgeNone;

现在坐标就是开始从Navigation Bar开始计算了。然而这种情况只适合在Navigation Bar的情况,如果没有Navigation Bar, 坐标仍然是从Status Bar顶部开始计算的。

如果底部有Tab Bar的情况呢,如果要兼容以前的frame设置,那么就需要设置UIViewController的edgesForExtendedLayout为UIRectEdgeNone。

代码如何适配iOS7

如果我们的代码没有用storyboard, 没有用xib,纯代码的情况,如果要适配iOS7,那么上面只是介绍了有Navigation Bar, Tool Bar的情况,如果只是单纯的View,那么我们的代码运行在iOS7上,会有向上20px偏移,这需要手动修改:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        self.view.bounds = CGRectMake(0, -20, self.view.frame.size.width, self.view.frame.size.height );
    }

这种方法需要对所有的UIViewController进行设置,比较麻烦,还有一种较为简单的方法,就是设置window,这样可以影响所有的subview, 参考自stackoverflow

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        [application setStatusBarStyle:UIStatusBarStyleLightContent];
        self.window.clipsToBounds =YES;
        self.window.frame =  CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
        
        //Added on 19th Sep 2013
        self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
    }

不过第二种方法有问题,当你Rotate Simulator的时候你将会看到问题,Status Bar位置将不动。所以我不推荐用第二种方法,可以写一个UIViewController的category方法,然后调用方法一中的代码。这样对全工程进行修改以适配iOS7.

有需要的朋友可以去看看这个博主写的文章,挺不错的,还有讲到使用AutoLayout来适配……

抱歉!评论已关闭.