iOS 7 8 升級問題總結

最近幾個項目做iOS8的升級。把遇到的典型問題總結下。

下面的代碼都是在記事本里敲得,可能有語法之類的錯。

升級前: 支持iPod4(iOS6), iPod5(iOS6) 和 iOS(iOS7)。特別說明一點的是,項目的iOS7兼容是用Xcode4.6做的。所以雖然項目也能在iOS7的設備上運行,但界面元素的風格跟iOS6完全一樣。

做iOS8升級的時候,用的是Xcode6.1。因爲之前的iOS7兼容用的並不是iOS7的元素,導致iOS8升級遇到了一些本應該在iOS7升級過程中就修復的問題,在這裏一起列了出來。

問題1: NavigationBar和ToolBar的背景色變得很淡,跟設置的顏色值不一致。
解決: 在iOS7中,給NavigationBar和ToolBar設置背景顏色的API換成了barTintColor:(UIColor *)color.在iOS6中,用的是tintColor:(UIColor *)color.

問題2: iOS7之後,屏幕元素向上移了。
解決:多半情況下,在有問題的viewDidLoad:方法裏,加下面代碼:
if([UIDevice currentDevice].systemVersion.floatValue >= 7.0) {
    self.edgesForExtendedLayout = RectxxxNone; //不記得值的名字了
}

問題3:StatusBar 背景色變了,跟NavigationBar的顏色一致(如果有NavigationBar的話),或者跟界面的背景色相同。需要改變StatusBar背景色。
解決:
3.1. 在iOS7之後,StatusBar的背景色默認是由NavigationBar的顏色(如果有NavigationBar的話),或跟界面的背景色決定的。可以在項目的.plist文件中加"View controller-based status bar appearance",值爲NO。這樣StatusBar顏色就不會受以上兩者的影響了。然後可以用[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];去設StatusBar的背景色。通過這一步,基本上就可以讓StatusBar的風格跟iOS6一致了。
3.2. 如果以上方案還不能滿足自定義的需求,我們有個項目是這樣做的:創建一個新的UIView,這個UIView的frame跟StatusBar的一樣,背景色設備想要的顏色,然後在AppDelegate中app將要啓動的時候通過window addSubView:把新view加到StatusBar的位置,這樣在左右的屏裏都可以顯示了。這個view也不會蓋住StatusBar上的時間之類的內容,因爲設的的是backgroudColor。或者根據需要在某個屏裏添加這樣一個view。
UIView *statusView = [[UIView alloc]initWithFrame:CGRectMake(0,0,20,320)];
[self.window addSubView:statusView]; //在AppDelegate中添加
[self.view addSubView:statusView]; //在具體的屏裏添加

問題4:隱藏status bar.
解決:
4.1. 在iOS7之前,調用[[UIApplication sharedApplication]setStatusBarHidden:YES];即可。不過這在iOS7中不管用。
4.2. 在iOS7之後,要分兩步。
    a. 重寫 -(BOOL)prefersStatusBarHidden; 返回YES。
    b. 在viewWillAppear:(BOOL)animated;中調用[self setNeedsStatusBarAppearanceUpdate];viewDidLoad/viewDidAppear中調用應該也可以,沒試。
針對問題4,有個特別的現象導致在iOS7中4.2的方法不管用。如果在屏裏添加了一個新的UIWindow,windowLevel = UIStatusBarWindowLevel + 1。如果需要隱藏StatusBar的屏裏有這麼一個自己加的UIWindow的話,StatusBar是隱藏不掉的。在這裏可以把UIWindow改成UIView,代碼再做相應修改,把原來在UIWindow中顯示的元素放到UIView中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章