ios 純代碼屏幕適配
為貢山等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及貢山網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、貢山網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
現(xiàn)在由于蘋果公司出了6/6s和6/6sPlus,讓寫蘋果程序的哥們?yōu)榱俗黾嫒莺茴^疼。用StoryBoard固然方便,但是后期做兼容要花費(fèi)太多的時(shí)間和精力。
使用AutoLayout雖然會(huì)在不同尺寸的屏幕下自動(dòng)布局,但是很多東西還是要自己手動(dòng)修改,而且使用AutoLayout的話有一個(gè)弊病,就是無法通過代碼來修改StoryBoard上控件的尺寸和位置。
使用純代碼搭建界面又會(huì)覺得不夠直觀,要花時(shí)間調(diào)整布局,雖然方便后期做調(diào)整兼容性,但是影響開發(fā)效率。
當(dāng)然個(gè)人覺得還是代碼和StoryBoard結(jié)合的方式比較方便。
先說下使用本方法的要求,首先iPhone5的界面一定要完全兼容,這樣才能完美兼容6和6Plus。
首先,我么我們要觀察一下5,6和6Plus的尺寸比例關(guān)系。發(fā)現(xiàn)了他們的關(guān)系后待會(huì)做兼容就明白了。
很明顯能看出這三種屏幕的尺寸寬高比是差不多的,因此可以在5的基礎(chǔ)上,按比例放大來兼容6和6Plus的屏幕。
在AppDelegate.h中
@property float autoSizeScaleX;@property float autoSizeScaleY;
在AppDelegate.m中
#define ScreenHeight [[UIScreen mainScreen] bounds].size.height//獲取屏幕高度,兼容性測試#define ScreenWidth [[UIScreen mainScreen] bounds].size.width//獲取屏幕寬度,兼容性測試 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate]; if(ScreenHeight > 480){ myDelegate.autoSizeScaleX = ScreenWidth/320; myDelegate.autoSizeScaleY = ScreenHeight/568; }else{ myDelegate.autoSizeScaleX = 1.0; myDelegate.autoSizeScaleY = 1.0; }}
因?yàn)閕Phone4s屏幕的高度是480,因此當(dāng)屏幕尺寸大于iPhone4時(shí),autoSizeScaleX和autoSizeScaleY即為當(dāng)前屏幕和iPhone5尺寸的寬高比。比如,
如果是5,autoSizeScaleX=1,autoSizeScaleY=1;
如果是6,autoSizeScaleX=1.171875,autoSizeScaleY=1.17429577;
如果是6Plus,autoSizeScaleX=1.29375,autoSizeScaleY=1.2957;
現(xiàn)在我們獲取了比例關(guān)系后,先來看一下如何解決代碼設(shè)置界面時(shí)的兼容。
CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)這個(gè)方法使我們常用的設(shè)置尺寸的方法,現(xiàn)在我設(shè)置了一個(gè)類似于這樣的方法。
在.m文件中
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake1(100, 100, 50, 50)]; CG_INLINE CGRect//注意:這里的代碼要放在.m文件最下面的位置CGRectMake1(CGFloat x, CGFloat y, CGFloat width, CGFloat height){ AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate]; CGRect rect; rect.origin.x = x * myDelegate.autoSizeScaleX; rect.origin.y = y * myDelegate.autoSizeScaleY; rect.size.width = width * myDelegate.autoSizeScaleX; rect.size.height = height * myDelegate.autoSizeScaleY; return rect;}
這樣,這個(gè)btn按鈕在5,6和6Plus的位置和尺寸比例都是一樣的。
代碼兼容完之后,來看一下StoryBoard的兼容,當(dāng)然,在平時(shí)的項(xiàng)目中我們不可能就一兩個(gè)視圖,而且每個(gè)視圖里面可定還套有很多其他視圖,如果把所有視圖的尺寸用手動(dòng)輸入CGRectMake的方法來改兼容的話工作量非常大,而且容易出錯(cuò)。經(jīng)過多次試驗(yàn),我想出一種能快速兼容大多數(shù)界面的方法
在AppDelegate.m中
//storyBoard view自動(dòng)適配+ (void)storyBoradAutoLay:(UIView *)allView{ for (UIView *temp in allView.subviews) { temp.frame = CGRectMake1(temp.frame.origin.x, temp.frame.origin.y, temp.frame.size.width, temp.frame.size.height); for (UIView *temp1 in temp.subviews) { temp1.frame = CGRectMake1(temp1.frame.origin.x, temp1.frame.origin.y, temp1.frame.size.width, temp1.frame.size.height); } }} //修改CGRectMakeCG_INLINE CGRectCGRectMake1(CGFloat x, CGFloat y, CGFloat width, CGFloat height){ AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate]; CGRect rect; rect.origin.x = x * myDelegate.autoSizeScaleX; rect.origin.y = y * myDelegate.autoSizeScaleY; rect.size.width = width * myDelegate.autoSizeScaleX; rect.size.height = height * myDelegate.autoSizeScaleY; return rect;}
storyBoradAutoLay是把當(dāng)前view進(jìn)行兩層遍歷,把里面的UIView類型的控件的尺寸取出來,乘以對應(yīng)的比例再賦值給它的尺寸,這樣StoryBoard里的兼容就完成了。如果你的界面里嵌套的比較多的話可以多加幾層遍歷。
在繼承了UIViewController的.m文件中
#import "AppDelegate.h"- (void)viewDidLoad{ [super viewDidLoad]; [AppDelegate storyBoradAutoLay:self.view];}
在所有的繼承了UIViewController的文件中,都加上storyBoradAutoLay這句代碼,就能把當(dāng)前的view進(jìn)行兼容。
現(xiàn)在我們來看一下使用了該方法兼容的前后對比效果吧。
iPhone6兼容前
iPhone6兼容后
iPhone6Plus兼容前
iPhone6Plus兼容后
如果整個(gè)項(xiàng)目做完后才開始做兼容的話這個(gè)方法的優(yōu)勢就體現(xiàn)出來了,面對幾十個(gè)工程文件,只需自定義并且替換你的CGRectMake方法,再加上storyBoradAutoLay這個(gè)方法就瞬間完成大部分甚至全部的兼容。
其實(shí)還是比較建議用代碼和StoryBoard結(jié)合的方式來寫代碼,無論是從做兼容還是效率來說都是比較好的。
如果遇到tableView的或者其他的兼容改動(dòng),手動(dòng)調(diào)整一下即可。