iOS屏幕適配

前言

在項(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
Simulator Screen Shot 2016年4月9日 下午3.59.55.png
  • 5s
Simulator Screen Shot 2016年4月9日 下午4.00.31.png
  • 4s

Simulator Screen Shot 2016年4月9日 下午4.01.12.png

其中绒怨,橘黃色的那個(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è)地方

屏幕快照 2016-04-09 下午4.30.17.png

在使用之前我們需要在這個(gè)地方設(shè)置一下基準(zhǔn)塔橡,一般情況下UI都會(huì)給我們一個(gè)基準(zhǔn)圖(大部分都是6梅割,但也不排除其他的情況),如果你的基準(zhǔn)是iphone6的話那這里就不用再進(jìn)行修改了葛家,如果不是那就在這里直接修改成相應(yīng)的屏幕的寬和高户辞,即如果你的基準(zhǔn)圖是5或者5s的話就把baseScreenWidth修改成320baseScreenHeight修改成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];


  • End
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末建炫,一起剝皮案震驚了整個(gè)濱河市畦韭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肛跌,老刑警劉巖艺配,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惋砂,居然都是意外死亡妒挎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門西饵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鳞芙,你說(shuō)我怎么就攤上這事眷柔。” “怎么了原朝?”我有些...
    開(kāi)封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵驯嘱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我喳坠,道長(zhǎng)鞠评,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任壕鹉,我火速辦了婚禮剃幌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晾浴。我一直安慰自己负乡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布脊凰。 她就那樣靜靜地躺著抖棘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上切省,一...
    開(kāi)封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天最岗,我揣著相機(jī)與錄音,去河邊找鬼朝捆。 笑死仑性,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的右蹦。 我是一名探鬼主播诊杆,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼何陆!你這毒婦竟也來(lái)了晨汹?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贷盲,失蹤者是張志新(化名)和其女友劉穎淘这,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體巩剖,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铝穷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佳魔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曙聂。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鞠鲜,靈堂內(nèi)的尸體忽然破棺而出宁脊,到底是詐尸還是另有隱情,我是刑警寧澤贤姆,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布榆苞,位于F島的核電站,受9級(jí)特大地震影響霞捡,放射性物質(zhì)發(fā)生泄漏坐漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一碧信、第九天 我趴在偏房一處隱蔽的房頂上張望赊琳。 院中可真熱鬧,春花似錦音婶、人聲如沸慨畸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寸士。三九已至檐什,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弱卡,已是汗流浹背乃正。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婶博,地道東北人瓮具。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像凡人,于是被迫代替她去往敵國(guó)和親名党。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容