天天看點

UI -- 适配iPhone5界面(autosizing屬性)

如何應用autosizing屬性使iOS應用程式界面适配iPhone5

另外兩篇适配iphone5文章:

http://blog.csdn.net/linzhiji/article/details/8000048

http://blog.csdn.net/linzhiji/article/details/8000125

第一篇 iphone4程式适配iphone5方法,先安iphone4模拟器上的ui寫程式所有空間都是ib脫的,什麼也不用管。直到程式寫好需要适配的時候在為每個xib檔案複制一份改為iphone5的ui大小,重新布局,在對應類的.m檔案裡面initwithcoud:方法裡面添加一個判斷

在編碼時,盡量不要寫死480,根據屏目前螢幕([UIScreen mainScreen].bounds)選擇size能在分辨率改變時省去不少麻煩。 

stackoverflow上代碼,如何判斷iphone 5

[html]  view plain copy

  1. #define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )  

如果要兼任ipad

[html]  view plain copy

  1. <p class="p1">#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )<span class="s1">568</span> ) < DBL_EPSILON )</p><p class="p1">#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @<span class="s2">"iPhone"</span> ] )</p><p class="p1">#define IS_IPHONE_SIMULATOR ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @<span class="s2">"iPhone Simulator"</span> ] )</p><p class="p1">#define IS_IPOD   ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @<span class="s2">"iPod touch"</span> ] )</p><p class="p1">#define IS_IPHONE_5 ( ((IS_IPHONE) || (IS_IPHONE_SIMULATOR)) && IS_WIDESCREEN )</p>  

第二篇 1.判斷目前裝置是iPad還是iPhone\iPod

  1. if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){
  2. NSLog(@"The Device is a iPad!");
  3. }else{
  4. NSLog(@"Not a iPad the device!");
  5. }

2.設定橫屏或者豎屏或者橫豎屏

  1. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  2. {
  3. //橫屏
  4. //return UIInterfaceOrientationIsLandscape(interfaceOrientation);
  5. //豎屏
  6. //return UIInterfaceOrientationIsPortrait(interfaceOrientation);
  7. //橫豎屏
  8. //return YES;
  9. }

iOS5和iOS6橫豎屏同時支援

iOS6中抛棄了如下這個方法

  1. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

為了同時支援iOS5和iOS6橫豎屏切換,可用如下方法或代碼

  1. 1 info.plist 中 Supported interface orientations中加入所有方向的支援
  2. 2 AppDelegate中加入方法
  3. -(NSUInteger)application:(UIApplication *)application
  4. supportedInterfaceOrientationsForWindow:(UIWindow *)window{
  5. return UIInterfaceOrientationMaskAll;
  6. } iOS6中為了後續支援任何方向的旋轉
  7. 3 任何你想控制旋轉的界面中加入方法
  8. // iOS6.0
  9. -(NSUInteger)supportedInterfaceOrientations{
  10. return UIInterfaceOrientationMaskPortrait; // 可以修改為任何方向
  11. }
  12. -(BOOL)shouldAutorotate{
  13. return YES;
  14. }
  15. // iOS5.0
  16. -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
  17. return (toInterfaceOrientation == UIInterfaceOrientationPortrait); // 可以修改為任何方向
  18. }
  19. 這樣你的app就可以同時支援iOS5和iOS6系統的橫豎屏切換了

3.導入舊工程,解決Xcode4.5以後模拟器螢幕不旋轉問題

  1. if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0){
  2. self.window.rootViewController = navigationCtrl;
  3. }else{
  4. [self.window addSubview:navigationCtrl.view];
  5. }

4.支援iPhone5:添加Retina4 launch image"[email protected]"

圖檔尺寸:

  1. Default.png 320x480
  2. [email protected] 640x960
  3. [email protected] 640x1136

5.根據iPhone5的寬和高,判斷目前裝置是不是iPhone5

  1. CGFloat screenWidth = [[UIScreen mainScreen] bounds].size.width;
  2. CGFloat screenHeight = [[UIScreen mainScreen] bounds].size.height;
  3. if ((screenWidth==568)||(screenHeight==568)) {
  4. isiPhone5 = YES;
  5. }

注意:iPhone5的高是568,取得螢幕大小用

  1. [UIScreen mainScreen].bounds

第三篇 iPhone5 的螢幕為 320 * 568 ,而之前的 iPhone 均為 320 * 480 。由于螢幕大小的變化,使得原來開發的應用在 iPhone5 上面看的話,會留下上下兩條黑邊,除此之外,很多頁面的布局也亂了。

實際上,最好的方法是,為iPhone5增加一個新的xib,重新布局UI,這樣子才能根據iPhone5螢幕的分辨率來進行UI設計,也是最好的解決方法。但是這種方法耗費的時間成本太大。本文提供一個快速的适配iPhone5的方法。(無需監測裝置型号,無需增加xib)。

1、消除上下黑邊:如果你原來的程式是适應320*480的話,在iPhone5上面運作的結果如下,可以看到上下有兩條黑邊。如下圖所示:

UI -- 适配iPhone5界面(autosizing屬性)
UI -- 适配iPhone5界面(autosizing屬性)
UI -- 适配iPhone5界面(autosizing屬性)

采用xcode4.5,編譯你的程式,會有一行warnning,如下所示:

UI -- 适配iPhone5界面(autosizing屬性)
UI -- 适配iPhone5界面(autosizing屬性)
UI -- 适配iPhone5界面(autosizing屬性)

點選這個warnning,即彈出:

UI -- 适配iPhone5界面(autosizing屬性)
UI -- 适配iPhone5界面(autosizing屬性)
UI -- 适配iPhone5界面(autosizing屬性)

點選add按鈕即可。

經過上面這個步驟之後,我們可以看到上下兩條黑邊不見了。

2、controller裡面的view布局:我們看到運作在iPhone5上的程式,布局有些地方亂了。這是由于布局的原因引起的。每個從view繼承下來的類,都有一個autosizing的屬性,我們可以通過autosizing屬性的調正來改變我們的布局來适配iPhone5。如下圖:

UI -- 适配iPhone5界面(autosizing屬性)
UI -- 适配iPhone5界面(autosizing屬性)
UI -- 适配iPhone5界面(autosizing屬性)

我們可以看到,autosizing在xib中可以直接設定,圖中顯示的是上下左右四個方向的縮進,以及中間的上下拉伸屬性。

我們先來看看上下左右的縮進,虛線表示按比例縮進,實線表示按于邊界距離固定縮進。

中間的橫向箭頭如果為實線,則表示目前的view的寬度和其superView的寬度保持比例縮放;如果是虛線,則表示目前view的寬度保持不變。

中間的縱向箭頭如果為實線,則表示目前的view的高度和其superView的高度保持比例縮放;如果是虛線,則表示目前view的高度保持不變。

我們在第一個步驟中,會将controller裡面的view自動拉伸到iPhone5的分辨率。是以,我們的xib還是借用原來的xib不用改動。而對于view中的subviews,則要修改其autosizing的屬性,以保證當view拉伸的時候,這些subviews也能跟着“動”起來。

3、如果有自定義的view并且是通過代碼add到其他的view上去的話,則需要通過代碼來設定autosizing的屬性。autosizing有六種屬性可以設定,分别如下:

UIViewAutoresizingFlexibleTopMargin:與superView上邊界保持動态距離(按比例)

UIViewAutoresizingFlexibleBottomMargin:與superView下邊界保持動态距離(按比例)

UIViewAutoresizingFlexibleLeftMargin:與superView左邊界保持動态距離(按比例)

UIViewAutoresizingFlexibleRightMargin:與superView右邊界保持動态距離(按比例)

UIViewAutoresizingFlexibleWidth:與superView寬度成比例

UIViewAutoresizingFlexibleHeight:與superView高度成比例

4、我們經常會在controller裡面實作一個方法,即showInView,即把目前controller的view顯示作為subview到其他view上去,如果你是想覆寫整個螢幕,則在showInView方法中應該使用下面語句來适配iPhone5:

[cpp]  view plain copy

  1. (void)showInView:(UIView*)view  
  2. {  
  3.   self.frame= view.bounds;  
  4.   // your codes.   
  5.   // ........   
  6. }  

同時,将controller裡的view的autosizing設定成按寬度和高度拉伸的即可。

注意:在适配iPhone5的時候,要注意不要去監測裝置的型号或者是裝置類型,因為我們是對像素做适配,而不是對某種機型做适配。你可以使用[[UIScreen mainScreen] bounds]來擷取目前裝置螢幕大小。

ui