前言
在項(xiàng)目中扛门,屏幕適配也是一個(gè)不容小覷的問(wèn)題,特別是在一個(gè)屏幕上需要一堆各種各樣的圖片布局的時(shí)候著實(shí)得費(fèi)點(diǎn)功夫纵寝,于是自己動(dòng)手寫了一個(gè)適配方案论寨,它會(huì)根據(jù)不同的手機(jī)尺寸對(duì)圖片進(jìn)行等比縮放,達(dá)到快速適配的效果爽茴,使用的時(shí)候很方便葬凳,我們?cè)僖膊挥脫?dān)心在一個(gè)型號(hào)適配好后其他機(jī)型出現(xiàn)圖片變形或者參差不齊的問(wèn)題,先看效果室奏,由于圖片不太容易找火焰,我就做了一個(gè)很簡(jiǎn)單的demo,最后一張圖片不到邊胧沫,不過(guò)不影響使用了昌简,大家可以看一下圖片在各種屏幕中的比例,是沒(méi)有發(fā)生變化的:
-
6s plus
Simulator Screen Shot 2016年4月9日 下午3.55.25.png - 6s
- 5s
- 4s
其中绒怨,橘黃色的那個(gè)模擬的導(dǎo)航欄的高度纯赎,固定44 dot,導(dǎo)航欄的上部留出了固定的20 dot南蹂,總共是64 dot犬金。
實(shí)現(xiàn)
- 頭文件
/**
* 對(duì)frame進(jìn)行縮放,得到縮放后的frame,適用于使用絕對(duì)坐標(biāo)來(lái)寫控件的frame
*
* @param x x
* @param y y
* @param width width
* @param height height
*
* @return CGRect(縮放后)
*/
+(CGRect ) makeFrameX:(CGFloat) x Y:(CGFloat) y W:(CGFloat) width H:(CGFloat) height;
/**
* 以其它控件的y坐標(biāo)作為參照佑附,返回該控件的frame
*
* @param x 該控件的x坐標(biāo)
* @param RelativeY 其它控件的y坐標(biāo) + ...
* @param width 該控件的寬度
* @param height 該控件的高度
*
* @return CGRect
*/
+(CGRect ) makeCloseWidgetFrameX:(CGFloat) x relativeY:(CGFloat) relativeY W:(CGFloat) width H:(CGFloat) height;
/**
* 以其它控件的x和y坐標(biāo)作為參照樊诺,返回該控件的frame
*
* @param Relativex 其它控件的x坐標(biāo) + ...
* @param y 其它控件的y坐標(biāo) + ...
* @param width 該控件的寬度
* @param height 該控件的高度
*
* @return CGRect
*/
+(CGRect ) makeCloseWidgetFrameRelativeX:(CGFloat) relativeX relativeY:(CGFloat) relativeY W:(CGFloat) width H:(CGFloat) height;
/**
* 以其它控件的x坐標(biāo)作為參照,返回該控件的frame
*
* @param Relativex 其它控件的x坐標(biāo) + ...
* @param y 該控件的y坐標(biāo)
* @param width 該控件的寬度
* @param height 該控件的高度
*
* @return CGRect
*/
+(CGRect ) makeCloseWidgetFrameX:(CGFloat) relativeX Y:(CGFloat) y W:(CGFloat) width H:(CGFloat) height;
/**
* 用于創(chuàng)建固定高度的導(dǎo)航欄
*
* @param x 該控件的x坐標(biāo)
* @param y 該控件的y坐標(biāo)
* @param width 該控件的寬度
* @param constantHeight 該控件的固定高度
*
* @return CGRect
*/
+(CGRect ) makeConstantHeightWidgetFrameX:(CGFloat) x Y:(CGFloat) y W:(CGFloat) width constantHeight:(CGFloat) constantHeight;
如果你覺(jué)得這樣的定制性仍然太強(qiáng)音同,有些更深層次的定制這幾個(gè)接口無(wú)法做到词爬,那么可以使用下面這幾個(gè)單獨(dú)的對(duì)x、y权均、w顿膨、h進(jìn)行單獨(dú)的定制,不過(guò)一般也是用不到的叽赊,上面這幾個(gè)接口已經(jīng)足夠平常的使用了:
/****************************************************
* *
* 下面這些一般是用不到的,除非是在定制性比較高的地方 *
* *
****************************************************
*/
/**
* 單獨(dú)定制x
*
* @param x x坐標(biāo)
*
* @return 返回縮放過(guò)后的x
*/
+(CGFloat ) makeX:(CGFloat )x;
/**
* 單獨(dú)定制y
*
* @param y y坐標(biāo)
*
* @return 返回縮放過(guò)后的y
*/
+(CGFloat ) makeY:(CGFloat )y;
/**
* 單獨(dú)定制寬
*
* @param w 寬度
*
* @return 返回縮放過(guò)后的寬度
*/
+(CGFloat ) makeW:(CGFloat )w;
/**
* 單獨(dú)定制高
*
* @param h 高度
*
* @return 返回縮放過(guò)后的高度
*/
+(CGFloat ) makeH:(CGFloat )h;
- 使用
貼了這么多恋沃,還沒(méi)說(shuō)如何使用,不要急必指,來(lái)了:
1囊咏、先說(shuō)一下使用前需要先設(shè)置的地方,當(dāng)然前提得導(dǎo)入頭文件ZYGFrameMake.h才行
在ZYGFrameMake.m中有這樣一個(gè)地方
在使用之前我們需要在這個(gè)地方設(shè)置一下基準(zhǔn)塔橡,一般情況下UI都會(huì)給我們一個(gè)基準(zhǔn)圖(大部分都是6梅割,但也不排除其他的情況),如果你的基準(zhǔn)是iphone6的話那這里就不用再進(jìn)行修改了葛家,如果不是那就在這里直接修改成相應(yīng)的屏幕的寬和高户辞,即如果你的基準(zhǔn)圖是5或者5s的話就把baseScreenWidth修改成320,baseScreenHeight修改成568癞谒,4s或者6p同理底燎。是的,就需要設(shè)置這一個(gè)地方弹砚,然后就可以直接把UI給的標(biāo)注直接扔到代碼中了双仍,再也不用擔(dān)心什么寬了高了還有什么起始位置,直接寫UI給的數(shù)字就可以了迅栅。
2殊校、創(chuàng)建導(dǎo)航欄,導(dǎo)航欄為固定高度读存,所以我們需要調(diào)用創(chuàng)建導(dǎo)航欄專用的那個(gè)方法为流,其內(nèi)部對(duì)坐標(biāo)y進(jìn)行了處理(要保持狀態(tài)欄的20不發(fā)生變化)
//在這里,以iPhone6為基準(zhǔn)让簿,所以寬度直接寫375就可以了
UIImageView *navImage = [[UIImageView alloc] initWithFrame:[ZYGFrameMake makeConstantHeightWidgetFrameX:0 Y:20 W:375 constantHeight:44]];
navImage.backgroundColor = [UIColor orangeColor];
NSLog(@"導(dǎo)航欄高度:%f",navImage.frame.size.height);//從打印的結(jié)果中我們可以看到在各種機(jī)型中導(dǎo)航欄的高度始終為44
[self.view addSubview:navImage];
3敬察、創(chuàng)建一張圖片,緊貼在導(dǎo)航欄的下方尔当,因?yàn)槭蔷o貼在導(dǎo)航欄的下方莲祸,所以在豎直方向上是取相對(duì)于導(dǎo)航欄的坐標(biāo)
UIImageView *image1 = [[UIImageView alloc] initWithFrame:[ZYGFrameMake makeCloseWidgetFrameX:0 relativeY:navImage.frame.origin.y + navImage.frame.size.height W:375 H:180]];
image1.image = [UIImage imageNamed:@"003"];
NSLog(@"image1的y坐標(biāo):%f",image1.frame.origin.y);
[self.view addSubview:image1];
4蹂安、最后說(shuō)一下示例中最后一張圖片,其x坐標(biāo)是相對(duì)于左邊的那張圖片來(lái)計(jì)算的锐帜,而y坐標(biāo)是相對(duì)于上部的那張圖片來(lái)計(jì)算的田盈,所以使用下面這個(gè)方法來(lái)算,當(dāng)然我們大可不必這樣來(lái)寫缴阎,就像剛開(kāi)始我說(shuō)的一樣直接按UI給的標(biāo)注去寫也是完全可以的允瞧,但那調(diào)用的方法就不能是下面這個(gè),而應(yīng)該是*+(CGRect ) makeFrameX:(CGFloat) x Y:(CGFloat) y W:(CGFloat) width H:(CGFloat) height *了蛮拔,這兩種方法的區(qū)別就在于一個(gè)是相對(duì)坐標(biāo)述暂,一個(gè)是絕對(duì)坐標(biāo)。
UIImageView *image3 = [[UIImageView alloc] initWithFrame:[ZYGFrameMake makeCloseWidgetFrameRelativeX:image2.frame.origin.x + image2.frame.size.width relativeY:image2.frame.origin.y W:120 H:100]];
image3.image = [UIImage imageNamed:@"001"];
[self.view addSubview:image3];
- demo下載地址
ZYGFrameMakeDemo 下載
- End