讓你的APP支持iPhone5
升級準備
為了支持iPhone5,我們首先需要準備以下工具和資源:
- 下載***版的XCode4.5
- 讓美術同學提供640 x 1136分辨率的啟動畫面,640 x 1136分辨率的程序截圖(用于在app store中顯示)
- 由于iPhone5使用的A6處理器采用了新的armv7s架構,所以如果你使用了第三方的靜態(tài)鏈接庫,需要下載對應支持armv7s的版本。我們由于使用了第三方的數據統(tǒng)計工具Flurry,所以下載更新了Flurry的靜態(tài)鏈接庫。
- 如果你的顯示器分辨率太小,將無法顯示完整的iPhone5模擬器,可選的解決辦法是換個更大的顯示器或者把顯示器豎起來,象我這樣:
另外還有一個簡單的辦法,可以在啟動模擬器后,用快捷鍵command+3(50%),command+2(75%), command+1(100%),來調整模擬器的顯示比例,謝謝Superrr一一 提供的方法,比我的簡單多了。
具體升級步驟如下
升級啟動畫面和第三方鏈接庫
升級啟動畫面,將美術同學提供的640 x 1136分辨率的啟動畫面圖片,命名為Default-568h@2x.png,添加到工程中即可。
升級第三方鏈接庫,這個只需要用新的第三方鏈接庫替換掉以前的即可。如果你使用了例如opencv這種需要自己編譯對應版本鏈接庫的開源庫,那么替換之前,需要自己先用xcode4.5編譯其armv7s版本的靜態(tài)鏈接庫。
調整xib文件
粉筆網客戶端的界面基本上都是頂部是UINavigationBar, 底部是UITabBar或UIToolBar,中間是UITableView。
對于這一類界面,調整起來非常簡單,只需要將UITableView設置成高度自動擴展的Autosizing方式,如下圖所示:
對于底部的UIToolBar,Autosizing設置成靠底部對齊的方式即可。如下圖所示:
代碼調整
有一些界面元素的位置是用代碼來設置的,例如“發(fā)表筆記”界面中浮動貼在輸入法鍵盤上面的各種可選操作的UIToolbar。因為鍵盤的高度在不同的輸入法下是不一樣的,所以需要用代碼動態(tài)調整。
我的調整代碼如下:
- // 說明:keyboardWillShow函數和keyboardWillHide函數分別監(jiān)聽了
- // UIKeyboardWillShowNotification和UIKeyboardWillHideNotification
- - (void) keyboardWillShow:(NSNotification *)notification {
- NSDictionary * info = [notification userInfo];
- CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
- float textViewHeight = UI_SCREEN_HEIGHT - UI_STATUS_BAR_HEIGHT - UI_NAVIGATION_BAR_HEIGHT - UI_TOOL_BAR_HEIGHT - kbSize.height;
- [UIView animateWithDuration:0.3 animations:^{
- _textView.frame = CGRectMake(0, UI_NAVIGATION_BAR_HEIGHT, UI_SCREEN_WIDTH, textViewHeight);
- _toolbar.frame = CGRectMake(0, UI_NAVIGATION_BAR_HEIGHT + textViewHeight, UI_SCREEN_WIDTH, UI_TOOL_BAR_HEIGHT);
- }];
- }
- - (void) keyboardWillHide:(NSNotification *)notification {
- CGSize kbSize = CGSizeMake(320, 216);
- float textViewHeight = UI_SCREEN_HEIGHT - UI_STATUS_BAR_HEIGHT - UI_NAVIGATION_BAR_HEIGHT - UI_TOOL_BAR_HEIGHT - kbSize.height;
- [UIView animateWithDuration:0.3 animations:^{
- _textView.frame = CGRectMake(0, UI_NAVIGATION_BAR_HEIGHT, UI_SCREEN_WIDTH, textViewHeight);
- _toolbar.frame = CGRectMake(0, UI_NAVIGATION_BAR_HEIGHT + textViewHeight, UI_SCREEN_WIDTH, UI_TOOL_BAR_HEIGHT);
- }];
- }
可以看到,我將設備的各種高度都定義成了宏,這里的宏UI_SCREEN_HEIGHT表示整個設備的高度,以前這個宏的值是固定的480,現(xiàn)在因為 iPhone5中高度值變了,所以我們將這個宏定義改成了如下的值,這樣,所有相關的用代碼實現(xiàn)的界面位置調整都搞定了。我的UI相關的宏定義如下:
- #define UI_NAVIGATION_BAR_HEIGHT 44
- #define UI_TOOL_BAR_HEIGHT 44
- #define UI_TAB_BAR_HEIGHT 49
- #define UI_STATUS_BAR_HEIGHT 20
- #define UI_SCREEN_WIDTH 320
- // 將以下宏定義的值從480改成[[UIScreen mainScreen] bounds].size.height
- #define UI_SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
如果你以前沒有將這些設備的高度值抽取成宏,我建議你通過查找替換,先將所有用到480的地方修改成宏,然后再增加上面的宏定義即可。
當然,也有一些調整稍微復雜一些,例如粉筆網首頁的上拉加載更多,需要判斷上拉高度是否到達閾值,這些也是和設備高度相關的。這些閾值信息以前可能就直接寫成和高度相關的值,例如220什么的,這些通過直接查找480還沒法直接找到。
對于這些問題,只能是通過在模擬器中測試,發(fā)現(xiàn)問題,然后再把這些“Magic Number”替換成用上面提到的宏計算的公式。例如我們的上拉加載更多的閾值宏定義如下:
- #define LOAD_MORE_TEXT_HEIGHT 77
- // 顯示文字閾值
- #define LOAD_MORE_THRESHOLD (UI_SCREEN_HEIGHT - UI_STATUS_BAR_HEIGHT - UI_NAVIGATION_BAR_HEIGHT - UI_TAB_BAR_HEIGHT - LOAD_MORE_TEXT_HEIGHT)
- // 刷新閾值
- #define LOAD_MORE_MAX (LOAD_MORE_THRESHOLD + 10.0)
調整屏幕Rotation的回調函數
從iOS6開始,蘋果修改了屏幕旋轉的回調函數。在iOS6以前,回調函數是
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
- {
- return (interfaceOrientation == UIInterfaceOrientationPortrait);
- }
現(xiàn)在新的回調函數是:
- - (BOOL)shouldAutorotate {
- return YES;
- }
- - (NSInteger)supportedInterfaceOrientations {
- return UIInterfaceOrientationMaskAllButUpsideDown;
- }
- - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
- return UIInterfaceOrientationPortrait;
- }
并且,現(xiàn)在是否旋轉屏幕是由最上層的View Controller決定。例如,如果你是由 UITabBarController或UINavigationController包起來的界面的話,是否旋轉屏幕就由 UITabBarController或UINavigationController中的shouldAutorotate回調決定,而默認其返回的是 YES。修改方法是給這2個容器Controller增加Addition,將其shouldAutorotate修改成由當前顯示的子view controller決定,或者直接默認返回NO。
提交應用
基本上就是以上這些調整工作了,完了之后用Xcode4.5編譯后提交審核,并且在itunes connect中設置iPhone5屏幕尺寸的app介紹截圖即可。業(yè)界傳言說對于支持iPhone5的程序,蘋果在應用審核的時候會優(yōu)先進行,我不知道 是否是真的,不過我們的應用確實只用了5天時間就通過了審核,這是我個人遇到過的最快的一次審核。