ios 6和 ios 7適配問題,讓程式同時支援iOS 6和iOS 7,setEdgesForExtendedLayout
由於各種原因,我們的程式需要同時支援iOS 7以及之前的版本(例如iOS 6),也就是說開發人員不得不同時在iOS 7和iOS 6之間進行開發。實際上開發人員對此是比較討厭的。
iOS 7中的布局問題
下面是非常簡單的一個程式,運行在iOS 6中的介面:
而要是運行在iOS 7的模擬器中,會看不到label了:<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+CjxpbWcgc3JjPQ=="http://www.2cto.com/uploadfile/Collfiles/20141025/2014102508564226.png" alt="\">
這是為什麼呢?我們對其reveal一下看看吧:
從可以看出,實際上label躲在NavigationBar後面了。在iOS 7中,蘋果引入了一個新的屬性,叫做[UIViewController setEdgesForExtendedLayout:],它的預設值為UIRectEdgeAll。當你的容器是navigation controller時,預設的布局將從navigation bar的頂部開始。這就是為什麼所有的UI元素都往上漂移了44pt。
修複這個問題的快速方法就是在方法- (void)viewDidLoad中添加如下一行代碼:
1 |
self.edgesForExtendedLayout = UIRectEdgeNone;
|
這樣問題就修複了。
iOS 6運行異常
現在如果在iOS 6中運行程式,會遇到下面這樣的運行時異常錯誤:
1 |
[LAViewController setEdgesForExtendedLayout:]: unrecognized selector sent to instance 0x778a210
|
所有只能在iOS 7中啟動並執行API需要重新封裝一下,如下代碼所示:
1234 |
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]){ self.edgesForExtendedLayout = UIRectEdgeNone;}
|
Xcode 4編譯錯誤
有些機器可能還在使用Xcode 4.6,當用4.6來編譯代碼時,會遇到下面的編譯錯誤:
12 |
Property 'edgesForExtendedLayout' not found on object of type 'LAViewController *'Use of undeclared identifier 'UIRectEdgeNone'
|
為了避免這個錯誤,可以建立下面的這個宏:
123 |
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000#define IOS7_SDK_AVAILABLE 1#endif
|
然後在需要的地方將iOS 7的程式碼封裝裝一下即可:
123 |
#ifdef IOS7_SDK_AVAILABLE...#endif
|
UILabel不一致的background
對於UILabel,在iOS 7中它的background顏色預設是clearColor,而在iOS 6中預設的是白色。所以,我們最好在代碼中對label的background顏色進行明確的設定:
1 |
view.backgroundColor = [UIColor clearColor];
|
全屏時隱藏狀態列
在iOS 6中,當調用presentViewController時,預設的modal screen將是全屏(UIModalPresentationFullScreen)。為了在iOS 7中也能獲得相同的效果,我們可以在modal controller中添加如下代碼:
1234 |
- (BOOL)prefersStatusBarHidden{ return YES;}
|
UIToolbar barStyle
有時候,我們會將UIToolbar與系統鍵盤結合起來使用。而在iOS 6中的鍵盤是黝黑色的,此時toolbar的style一般也是類似的,如下代碼所示:
1 |
self.barStyle = UIBarStyleBlack;// or UIBarStyleBlackTranslucents
|
而在iOS 7中,鍵盤變為了亮色,因此我們需要根據不同的iOS 版本,設定不同的bar style。
12345678 |
if ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending){ self.barStyle = UIBarStyleDefault;}else{ self.barStyle = UIBarStyleBlack;//or UIBarStyleBlackTranslucent}
|
更多
上面這些技巧是我目前在開發中遇到的,肯定還有更多的技巧,大家要是知道的話可以告訴我。
最後送大家一個圖,看看相關差異吧: