让你的APP支持iPhone5

移动开发 iOS
去年国庆节前,为了支持iPhone5的屏幕分辨率(640象素 x 1136象素),我尝试着升级粉笔网iPhone客户端。整个过程花了大概一天的时间,我把这个过程总结下来,希望对大家有帮助。

升级准备

为了支持iPhone5,我们首先需要准备以下工具和资源:

  1. 下载***版的XCode4.5
  2. 让美术同学提供640 x 1136分辨率的启动画面,640 x 1136分辨率的程序截图(用于在app store中显示)
  3. 由于iPhone5使用的A6处理器采用了新的armv7s架构,所以如果你使用了第三方的静态链接库,需要下载对应支持armv7s的版本。我们由于使用了第三方的数据统计工具Flurry,所以下载更新了Flurry的静态链接库。
  4. 如果你的显示器分辨率太小,将无法显示完整的iPhone5模拟器,可选的解决办法是换个更大的显示器或者把显示器竖起来,象我这样:

[[70678]]

另外还有一个简单的办法,可以在启动模拟器后,用快捷键command+3(50%),command+2(75%), command+1(100%),来调整模拟器的显示比例,谢谢Superrr一一 提供的方法,比我的简单多了。

具体升级步骤如下

升级启动画面和第三方链接库

升级启动画面,将美术同学提供的640 x 1136分辨率的启动画面图片,命名为Default-568h@2x.png,添加到工程中即可。

升级第三方链接库,这个只需要用新的第三方链接库替换掉以前的即可。如果你使用了例如opencv这种需要自己编译对应版本链接库的开源库,那么替换之前,需要自己先用xcode4.5编译其armv7s版本的静态链接库。

调整xib文件

粉笔网客户端的界面基本上都是顶部是UINavigationBar, 底部是UITabBar或UIToolBar,中间是UITableView。

对于这一类界面,调整起来非常简单,只需要将UITableView设置成高度自动扩展的Autosizing方式,如下图所示:

对于底部的UIToolBar,Autosizing设置成靠底部对齐的方式即可。如下图所示:

代码调整

有一些界面元素的位置是用代码来设置的,例如“发表笔记”界面中浮动贴在输入法键盘上面的各种可选操作的UIToolbar。因为键盘的高度在不同的输入法下是不一样的,所以需要用代码动态调整。

我的调整代码如下:

  1. // 说明:keyboardWillShow函数和keyboardWillHide函数分别监听了 
  2. // UIKeyboardWillShowNotification和UIKeyboardWillHideNotification 
  3. - (void) keyboardWillShow:(NSNotification *)notification { 
  4.     NSDictionary * info = [notification userInfo]; 
  5.     CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size; 
  6.     float textViewHeight = UI_SCREEN_HEIGHT - UI_STATUS_BAR_HEIGHT - UI_NAVIGATION_BAR_HEIGHT - UI_TOOL_BAR_HEIGHT - kbSize.height; 
  7.     [UIView animateWithDuration:0.3 animations:^{ 
  8.         _textView.frame = CGRectMake(0, UI_NAVIGATION_BAR_HEIGHT, UI_SCREEN_WIDTH, textViewHeight); 
  9.         _toolbar.frame = CGRectMake(0, UI_NAVIGATION_BAR_HEIGHT + textViewHeight, UI_SCREEN_WIDTH, UI_TOOL_BAR_HEIGHT); 
  10.     }]; 
  11. - (void) keyboardWillHide:(NSNotification *)notification { 
  12.     CGSize kbSize = CGSizeMake(320216); 
  13.     float textViewHeight = UI_SCREEN_HEIGHT - UI_STATUS_BAR_HEIGHT - UI_NAVIGATION_BAR_HEIGHT - UI_TOOL_BAR_HEIGHT - kbSize.height; 
  14.     [UIView animateWithDuration:0.3 animations:^{ 
  15.         _textView.frame = CGRectMake(0, UI_NAVIGATION_BAR_HEIGHT, UI_SCREEN_WIDTH, textViewHeight); 
  16.         _toolbar.frame = CGRectMake(0, UI_NAVIGATION_BAR_HEIGHT + textViewHeight, UI_SCREEN_WIDTH, UI_TOOL_BAR_HEIGHT); 
  17.     }]; 

可以看到,我将设备的各种高度都定义成了宏,这里的宏UI_SCREEN_HEIGHT表示整个设备的高度,以前这个宏的值是固定的480,现在因为 iPhone5中高度值变了,所以我们将这个宏定义改成了如下的值,这样,所有相关的用代码实现的界面位置调整都搞定了。我的UI相关的宏定义如下:

  1. #define UI_NAVIGATION_BAR_HEIGHT        44 
  2. #define UI_TOOL_BAR_HEIGHT              44 
  3. #define UI_TAB_BAR_HEIGHT               49 
  4. #define UI_STATUS_BAR_HEIGHT            20 
  5. #define UI_SCREEN_WIDTH                 320 
  6. // 将以下宏定义的值从480改成[[UIScreen mainScreen] bounds].size.height 
  7. #define UI_SCREEN_HEIGHT                ([[UIScreen mainScreen] bounds].size.height) 

如果你以前没有将这些设备的高度值抽取成宏,我建议你通过查找替换,先将所有用到480的地方修改成宏,然后再增加上面的宏定义即可。

当然,也有一些调整稍微复杂一些,例如粉笔网首页的上拉加载更多,需要判断上拉高度是否到达阈值,这些也是和设备高度相关的。这些阈值信息以前可能就直接写成和高度相关的值,例如220什么的,这些通过直接查找480还没法直接找到。

对于这些问题,只能是通过在模拟器中测试,发现问题,然后再把这些“Magic Number”替换成用上面提到的宏计算的公式。例如我们的上拉加载更多的阈值宏定义如下:

  1. #define LOAD_MORE_TEXT_HEIGHT 77 
  2. // 显示文字阈值 
  3. #define LOAD_MORE_THRESHOLD (UI_SCREEN_HEIGHT - UI_STATUS_BAR_HEIGHT - UI_NAVIGATION_BAR_HEIGHT - UI_TAB_BAR_HEIGHT - LOAD_MORE_TEXT_HEIGHT) 
  4. // 刷新阈值 
  5. #define LOAD_MORE_MAX       (LOAD_MORE_THRESHOLD + 10.0) 

调整屏幕Rotation的回调函数

从iOS6开始,苹果修改了屏幕旋转的回调函数。在iOS6以前,回调函数是

  1. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
  2.     return (interfaceOrientation == UIInterfaceOrientationPortrait); 

现在新的回调函数是:

  1. - (BOOL)shouldAutorotate { 
  2.     return YES; 
  3. - (NSInteger)supportedInterfaceOrientations { 
  4.     return UIInterfaceOrientationMaskAllButUpsideDown; 
  5. - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
  6.     return UIInterfaceOrientationPortrait; 

并且,现在是否旋转屏幕是由最上层的View Controller决定。例如,如果你是由 UITabBarController或UINavigationController包起来的界面的话,是否旋转屏幕就由 UITabBarController或UINavigationController中的shouldAutorotate回调决定,而默认其返回的是 YES。修改方法是给这2个容器Controller增加Addition,将其shouldAutorotate修改成由当前显示的子view controller决定,或者直接默认返回NO。

提交应用

基本上就是以上这些调整工作了,完了之后用Xcode4.5编译后提交审核,并且在itunes connect中设置iPhone5屏幕尺寸的app介绍截图即可。业界传言说对于支持iPhone5的程序,苹果在应用审核的时候会优先进行,我不知道 是否是真的,不过我们的应用确实只用了5天时间就通过了审核,这是我个人遇到过的最快的一次审核。

责任编辑:闫佳明 来源: beyondvincent
相关推荐

2012-10-09 15:28:06

2013-07-23 07:34:54

iOS开发学习适配iphone5

2011-10-05 03:37:59

iPhone5iPhone 4S苹果

2012-05-11 17:45:26

iPhone5概念机电脑管家安全

2015-10-10 11:38:10

ios9spotlight

2012-03-11 15:23:01

iPhone

2011-07-13 09:32:05

苹果iOS 5

2013-07-31 11:06:26

青苹果夏威夷版iPhoiPhone5定制版

2012-06-21 09:41:34

郭台铭iPhone 5

2011-03-29 09:14:46

WWDC苹果iPhone

2013-04-09 10:35:01

2013-03-22 13:10:20

3GS苹果移动应用

2013-07-12 13:24:19

App诱惑

2012-04-25 23:00:05

App Store

2012-09-20 14:22:34

2011-10-11 10:22:54

iPhone5苹果

2013-07-05 13:48:47

App

2011-05-03 10:07:12

iPhone5乔布斯苹果

2013-09-12 10:11:57

苹果iPhone 5ciPhone 5s

2011-07-29 09:08:51

iPhone 5PhoneiPad
点赞
收藏

51CTO技术栈公众号