一.前言
iOS7可以说是苹果一次革命性的变化,这次变化也足够广大iOS开发者们苦苦折腾一阵子了。但是,开发还是要继续,支持iOS7是迟早要解决的问题。
这次的变化在布局上的体现有:view默认是全屏模式,即状态栏statusbar不占内容视图的尺寸,变为全透明的覆盖在内容视图上层。所有的bar(navigation bar, tool bar, search bars 与scope bars) 都是半透明的,默认也是不占用内容视图的尺寸的。
所以,iOS7之前的工程,在不修改的情况下,必然会出现状态栏覆盖在内容视图上的情况,有可能会出现导航条等覆盖在界面上的情况。这里重点解决这两个问题。
二.每个应用必须做的事情
1. 下载和安装最新的XCode5
2. 解决状态栏和导航栏的问题
1)使用xib或者storyboard布局
a) 没有使用UINavigationControler
用xcode5打开xib,在File inspector中,“Opens in”选择“Default(5.0)”,如下图。
然后“View as”选择“iOS6.1 and Earlier”,如下图。
然后针对xib中的控件,调整增量“iOS 6/7 Deltas”的Y值。增量的意思是如果运行在ios7的模式下,就使其坐标增加的量,如果是6或更早的,就是直接使用上面的坐标(Origin处设置的值)。
说明:“View as”选项表示当前编辑的xib是在哪个版本下面的效果。如果选择”iOS6.1 and Earlier”,那么Deltas值表示在ios7下面的增量。因为ios6下面是从{0,0}点开始布局的,所以在iOS7下要想不被status bar覆盖,需要从{0,20}开始布局,即Deltas为20。反之,如果View as为默认的”iOS7.0 and Later”,那么Deltas为-20。
b) 使用了UINavigationControler,且隐藏navigationBar
针对UINavigationControler中所有viewcontroller.view的xib,使用同a)中的方法修改设置。
c) 使用了UINavigationControler,且显示navigationBar
这种情况设置navigationBar.translucent = NO 即可。
2)使用纯代码布局
使用纯代码布局,只能在代码中手动修改origin.y值和height。
具体做法是,判断当前设备的系统版本,如果是7.0及以上,则将UIViewController控制的view的frame.origin.y增加20像素即可。特别的,如果是根视图,如果使用window.rootViewController = firstViewController的方式,则firstView中各个元素都需要调整origin.y的值;如果使用[windowaddSubView:firstView]的方式,则只需调整firstView。
为了简化代码,可以将判断系统版本和调整frame的方法在prefix.pch中定义为宏,例如,在MyProject-Prefix.pch中定义IOS_7和IOS6_7_DELTA(V,X,Y,W,H)两个宏:
#define IOS_7 ([[[UIDevicecurrentDevice] systemVersion] floatValue] >= 7.0f)
#define IOS6_7_DELTA(V,X,Y,W,H) if(IOS_7) {CGRect f = V.frame;f.origin.x += X;f.origin.y += Y;f.size.width +=W;f.size.height += H;V.frame=f;}
然后,例如在SubViewController的viewDidload方法中这样调整:
if (IOS_7) {
IOS6_7_DELTA(self.view,0,20,0,-20);
}
如果是iOS7之前的版本是全屏布局的,height需要-20的增量,否则不需要。
也可以定义一个view controller父类,在父类中处理,需要调整的子视图控制器继承该父类。
3. 更新app icon
在iOS7下,iPhone应用的高分辨率appicon尺寸是120 x 120 像素,iPad应用的高分辨率app icon是152 x 152像素(见下表)。iOS7下Spotlight search results icon标准和高分辨率尺寸分别是40 x 40和80 x 80 (Info.plist配置中非必须项,官方建议设置)。
Icon | 设备类型 | iOS6及之前 | iOS7及之后 | ||
标准(像素) | 高分辨率(@2x) 像素 | 标准(像素) | 高分辨率(@2x) 像素 | ||
App Icon (required) | iPhone | 57 x 57 | 114 x 114 | 60 x 60 | 120 x 120 |
App Icon (required) | iPad | 72 x 72 | 144 x 144 | 76 x 76 | 152 x 152 |
4. 更新启动页图片尺寸
如果之前的启动页图片(launch image)不包含状态栏的高度,则launch image高度都应该增加20像素(对于iPhone, Default-568h@2x.png是640 x 1136像素,Default@2x.png是640 x 960像素,Default.png是320 x 480像素; 对于iPad,竖屏分别是768 x1024 和1536 x 2048像素, 横屏分别是 1024 x 768 和 2048 x 1536像素)。
5. 支持高清显示和iPhone5
如果之前还没做这些,那么,现在是时候了。
三.每个应用都应该做的事情
1. 检查app中写死的UI数值,比如size和position,用系统提供的动态数值替换它们。
2. 检查app中使用UIKit的地方,看尺度和风格发生变化的控制器和视图是否对布局和外观产生了影响。比如,开关更加宽了,组合式表格(grouped tables)变成通栏的了,进度指示条变成了非常细的小条。
3. 调整App的UI风格,例如尝试无边框的按钮,慎用投影、渐变、浮雕效果。因为iOS 7的美学重视平缓、分层——尽量少使用让UI元素看起来拟实的视觉效果。
4. 必要的话,将app升级到iOS 6中推荐的最佳实践方法(如:Auto Layout和StoryBoard)并确保app不使用废弃的API。
四. 参考资料
1. iOS 7 UI Transition Guide
中文版http://mued.sohu.com/2013/06/ios-7-ui-transition-guide/
2. iOS Human Interface Guidelines
http://blog.csdn.net/rhljiayou/article/details/12029927
4. 适配iOS7开发
http://www.ifun.cc/blog/2013/09/28/gua-pei-ios7kai-fa/
5. Developer’s Guide to the iOS 7Status Bar
http://www.doubleencore.com/2013/09/developers-guide-to-the-ios-7-status-bar/