如何應用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
- #define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
如果要兼任ipad
[html] view plain copy
- <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
- if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){
- NSLog(@"The Device is a iPad!");
- }else{
- NSLog(@"Not a iPad the device!");
- }
2.設定橫屏或者豎屏或者橫豎屏
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
- {
- //橫屏
- //return UIInterfaceOrientationIsLandscape(interfaceOrientation);
- //豎屏
- //return UIInterfaceOrientationIsPortrait(interfaceOrientation);
- //橫豎屏
- //return YES;
- }
iOS5和iOS6橫豎屏同時支援
iOS6中抛棄了如下這個方法
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
為了同時支援iOS5和iOS6橫豎屏切換,可用如下方法或代碼
- 1 info.plist 中 Supported interface orientations中加入所有方向的支援
- 2 AppDelegate中加入方法
- -(NSUInteger)application:(UIApplication *)application
- supportedInterfaceOrientationsForWindow:(UIWindow *)window{
- return UIInterfaceOrientationMaskAll;
- } iOS6中為了後續支援任何方向的旋轉
- 3 任何你想控制旋轉的界面中加入方法
- // iOS6.0
- -(NSUInteger)supportedInterfaceOrientations{
- return UIInterfaceOrientationMaskPortrait; // 可以修改為任何方向
- }
- -(BOOL)shouldAutorotate{
- return YES;
- }
- // iOS5.0
- -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
- return (toInterfaceOrientation == UIInterfaceOrientationPortrait); // 可以修改為任何方向
- }
- 這樣你的app就可以同時支援iOS5和iOS6系統的橫豎屏切換了
3.導入舊工程,解決Xcode4.5以後模拟器螢幕不旋轉問題
- if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0){
- self.window.rootViewController = navigationCtrl;
- }else{
- [self.window addSubview:navigationCtrl.view];
- }
4.支援iPhone5:添加Retina4 launch image"[email protected]"
圖檔尺寸:
- Default.png 320x480
- [email protected] 640x960
- [email protected] 640x1136
5.根據iPhone5的寬和高,判斷目前裝置是不是iPhone5
- CGFloat screenWidth = [[UIScreen mainScreen] bounds].size.width;
- CGFloat screenHeight = [[UIScreen mainScreen] bounds].size.height;
- if ((screenWidth==568)||(screenHeight==568)) {
- isiPhone5 = YES;
- }
注意:iPhone5的高是568,取得螢幕大小用
- [UIScreen mainScreen].bounds
第三篇 iPhone5 的螢幕為 320 * 568 ,而之前的 iPhone 均為 320 * 480 。由于螢幕大小的變化,使得原來開發的應用在 iPhone5 上面看的話,會留下上下兩條黑邊,除此之外,很多頁面的布局也亂了。
實際上,最好的方法是,為iPhone5增加一個新的xib,重新布局UI,這樣子才能根據iPhone5螢幕的分辨率來進行UI設計,也是最好的解決方法。但是這種方法耗費的時間成本太大。本文提供一個快速的适配iPhone5的方法。(無需監測裝置型号,無需增加xib)。
1、消除上下黑邊:如果你原來的程式是适應320*480的話,在iPhone5上面運作的結果如下,可以看到上下有兩條黑邊。如下圖所示:


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


點選這個warnning,即彈出:


點選add按鈕即可。
經過上面這個步驟之後,我們可以看到上下兩條黑邊不見了。
2、controller裡面的view布局:我們看到運作在iPhone5上的程式,布局有些地方亂了。這是由于布局的原因引起的。每個從view繼承下來的類,都有一個autosizing的屬性,我們可以通過autosizing屬性的調正來改變我們的布局來适配iPhone5。如下圖:


我們可以看到,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
- (void)showInView:(UIView*)view
- {
- self.frame= view.bounds;
- // your codes.
- // ........
- }
同時,将controller裡的view的autosizing設定成按寬度和高度拉伸的即可。
注意:在适配iPhone5的時候,要注意不要去監測裝置的型号或者是裝置類型,因為我們是對像素做适配,而不是對某種機型做适配。你可以使用[[UIScreen mainScreen] bounds]來擷取目前裝置螢幕大小。