frame與bounds的區(qū)別詳解

首先,我們來看一下iOS特有的坐標(biāo)系,在iOS坐標(biāo)系中以左上角為坐標(biāo)原點(diǎn),往右為X正方向饮亏,往下是Y正方向如下圖:


圖片.png

bounds和frame都是屬于CGRect類型的結(jié)構(gòu)體,系統(tǒng)的定義如下峭状,包含一個(gè)CGPoint(起點(diǎn))和一個(gè)CGSize(尺寸)子結(jié)構(gòu)體克滴。

struct CGRect {
    CGPoint origin;
    CGSize size;
};
復(fù)制代碼

origin決定了view的起點(diǎn),size決定View的尺寸优床。

1.frame

frame是每個(gè)view必備的屬性,表示view在父view坐標(biāo)系統(tǒng)中的位置和大小誓焦,參照點(diǎn)是父視圖的坐標(biāo)系統(tǒng)胆敞。

示例代碼:

UIView *viewA = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 300, 300)];
[viewA setBackgroundColor:[UIColor blueColor]];
[self.view addSubview:viewA];
NSLog(@"viewA - %@",NSStringFromCGRect(viewA.frame));

UIView *viewB = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
[viewB setBackgroundColor:[UIColor yellowColor]];
[viewA addSubview:viewB];
NSLog(@"viewB - %@",NSStringFromCGRect(viewB.frame));

UIView *viewC = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[viewC setBackgroundColor:[UIColor redColor]];
[self.view addSubview:viewC];
NSLog(@"viewC - %@",NSStringFromCGRect(viewC.frame));
復(fù)制代碼

打印結(jié)果:

2018-01-14 21:35:16.196389+0800 frame & bounds[1485:121325] viewA - {{50, 50}, {300, 300}}
2018-01-14 21:35:16.196647+0800 frame & bounds[1485:121325] viewB - {{50, 50}, {200, 200}}
2018-01-14 21:35:16.196802+0800 frame & bounds[1485:121325] viewC - {{100, 100}, {200, 200}}
復(fù)制代碼

效果圖:

圖片.png

以上可以看出,viewB和viewC的起點(diǎn)重合杂伟,但是從打印結(jié)果來看移层,viewB的起點(diǎn)為(50,50),而viewCde起點(diǎn)為(100,100)赫粥。原因就是frame中的位置是以父視圖的坐標(biāo)系為標(biāo)準(zhǔn)來確定當(dāng)前視圖的位置观话,viewB的父視圖為viewA,viewC的父視圖為self.view越平,而由于viewA的起點(diǎn)為(50,50)频蛔,所以viewB與viewC起點(diǎn)才會(huì)重合。

2.bounds

bounds也是每個(gè)view都有的屬性秦叛,這個(gè)屬性我們一般不進(jìn)行設(shè)置晦溪,表示view在本地坐標(biāo)系統(tǒng)中的位置和大小。參照點(diǎn)是本地坐標(biāo)系統(tǒng)挣跋。如果我們對(duì)上例打印bounds三圆,將會(huì)得到以下結(jié)果:

2018-01-14 22:03:44.385207+0800 frame & bounds[1635:140821] viewA - {{0, 0}, {300, 300}}
2018-01-14 22:03:44.385482+0800 frame & bounds[1635:140821] viewB - {{0, 0}, {200, 200}}
2018-01-14 22:03:44.385646+0800 frame & bounds[1635:140821] viewC - {{0, 0}, {100, 100}}
復(fù)制代碼

因?yàn)槲覀儾]有設(shè)置bounds值,那么,bounds到底有什么作用呢舟肉。這里強(qiáng)調(diào)修噪,每個(gè)視圖都有自己的坐標(biāo)系,且這個(gè)坐標(biāo)系默認(rèn)以自身的左上角為坐標(biāo)原點(diǎn)路媚,所有子視圖以這個(gè)坐標(biāo)系的原點(diǎn)為基準(zhǔn)點(diǎn)黄琼。bounds的位置代表的是子視圖看待當(dāng)前視圖左上角的位置,bounds的大小代表當(dāng)前視圖的大小磷籍。原則如下:

  • 更改bounds中的位置對(duì)于當(dāng)前視圖沒有影響适荣,相當(dāng)于更改了當(dāng)前視圖的坐標(biāo)系,對(duì)于子視圖來說當(dāng)前視圖的左上角已經(jīng)不再是(0,0)院领, 而是改變后的坐標(biāo)弛矛,坐標(biāo)系改了,那么所有子視圖的位置也會(huì)跟著改變比然。
  • 更改bounds的大小丈氓,bounds的大小代表當(dāng)前視圖的長(zhǎng)和寬,修改長(zhǎng)寬后强法,中心點(diǎn)繼續(xù)保持不變万俗, 長(zhǎng)寬進(jìn)行改變,通過bounds修改長(zhǎng)寬看起來就像是以中心點(diǎn)為基準(zhǔn)點(diǎn)對(duì)長(zhǎng)寬兩邊同時(shí)進(jìn)行縮放饮怯。

以下給出例子詳細(xì)討論闰歪。

3.兩者的區(qū)別

3.1 origin的區(qū)別

如下圖:

圖片.png

此時(shí),如果我們把ViewA的bounds改為(0,100)蓖墅,結(jié)果如下:

圖片.png

我們始終要清楚库倘,bounds的位置代表的是子視圖看待當(dāng)前視圖左上角的位置。 bounds遵守的原則一中论矾,更改bounds中的位置對(duì)于當(dāng)前視圖(ViewA)沒有影響教翩,相當(dāng)于更改了ViewA的坐標(biāo)系,但是子視圖(ViewB)不同贪壳,對(duì)于ViewB來說ViewA的左上角已經(jīng)不再是(0,0)饱亿, 而是(0,100),所以對(duì)于ViewB來說闰靴,ViewA坐標(biāo)系的原點(diǎn)其實(shí)是在紅色箭頭所指處的上方100處彪笼,而此時(shí)ViewB的frame.origin為(200,100),所以ViewB的上邊與ViewA上邊重合传黄。

如果我們更改ViewA的bounds為(200,0)杰扫,同理(可以自己思考試試),結(jié)果如下:

圖片.png

3.2 size的區(qū)別

frame的size直接決定了view的大小膘掰,而bounds的size修改后章姓,view的中心點(diǎn)不變佳遣,長(zhǎng)寬以中心點(diǎn)進(jìn)行縮放。

如下例:

UIView *viewA = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 240)];
[viewA setBackgroundColor:[UIColor grayColor]];
[self.view addSubview:viewA];

UIView *viewB = [[UIView alloc] initWithFrame:CGRectMake(100, 50, 160, 120)];
[viewB setBackgroundColor:[UIColor blueColor]];
[viewA addSubview:viewB];

//viewB設(shè)置size(320,160)
[viewB setBounds:CGRectMake(0, 0, 320, 240)];
復(fù)制代碼

結(jié)果如下:

圖片.png
圖片.png

第二個(gè)圖為設(shè)置了size之后的結(jié)果凡伊,viewB左上點(diǎn)距離viewA顯然不為(100,50)零渐,而是進(jìn)行了基于viewB視圖中心點(diǎn)的縮放操作。

4.總結(jié)

  • frame不管對(duì)于位置還是大小系忙,改變的都是自己本身诵盼。
  • frame的位置是以父視圖的坐標(biāo)系為參照,從而確定當(dāng)前視圖在父視圖中的位置银还。
  • frame的大小改變時(shí)风宁,當(dāng)前視圖的左上角位置不會(huì)發(fā)生改變,只是大小發(fā)生改變蛹疯。
  • bounds改變位置時(shí)戒财,改變的是子視圖的位置,自身沒有影響捺弦;其實(shí)就是改變了本身的坐標(biāo)系原點(diǎn)饮寞,默認(rèn)本身坐標(biāo)系的原點(diǎn)是左上角。
  • bounds的大小改變時(shí)列吼,當(dāng)前視圖的中心點(diǎn)不會(huì)發(fā)生改變幽崩,當(dāng)前視圖的大小發(fā)生改變,看起來效果就想縮放一樣寞钥。

5.參考

代碼Git地址:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市理郑,隨后出現(xiàn)的幾起案子太示,更是在濱河造成了極大的恐慌,老刑警劉巖香浩,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異臼勉,居然都是意外死亡邻吭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門宴霸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來囱晴,“玉大人,你說我怎么就攤上這事瓢谢』矗” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵氓扛,是天一觀的道長(zhǎng)枯芬。 經(jīng)常有香客問我论笔,道長(zhǎng),這世上最難降的妖魔是什么千所? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任狂魔,我火速辦了婚禮,結(jié)果婚禮上淫痰,老公的妹妹穿的比我還像新娘最楷。我一直安慰自己,他們只是感情好待错,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布籽孙。 她就那樣靜靜地躺著,像睡著了一般火俄。 火紅的嫁衣襯著肌膚如雪犯建。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天烛占,我揣著相機(jī)與錄音胎挎,去河邊找鬼。 笑死忆家,一個(gè)胖子當(dāng)著我的面吹牛犹菇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芽卿,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼揭芍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了卸例?” 一聲冷哼從身側(cè)響起称杨,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎筷转,沒想到半個(gè)月后姑原,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呜舒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年锭汛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袭蝗。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唤殴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出到腥,到底是詐尸還是另有隱情朵逝,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布乡范,位于F島的核電站配名,受9級(jí)特大地震影響啤咽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜段誊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一闰蚕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧连舍,春花似錦没陡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至潜腻,卻和暖如春埃儿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背融涣。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工童番, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人威鹿。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓剃斧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親忽你。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幼东,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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