ios 6和 ios 7適配問題,讓程式同時支援iOS 6和iOS 7,setEdgesForExtendedLayout

來源:互聯網
上載者:User

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}
更多

上面這些技巧是我目前在開發中遇到的,肯定還有更多的技巧,大家要是知道的話可以告訴我。

最後送大家一個圖,看看相關差異吧:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.