你真的明白frame和bounds了嗎

前言

也許你做ios開發(fā)已經(jīng)有些年了瘤泪,也許你才剛剛開始加入ios開發(fā)大軍,大神也好席揽,小白也好,而下面兩行代碼凳谦,也許是我們敲的最想吐的幾行代碼之一:

 self.XXView.frame = CGRectMake(0, 0, 100, 100);
 self.XXView.bounds = CGRectMake(0, 0, 100, 100);

一個(gè)設(shè)置坐標(biāo),一個(gè)設(shè)置邊框衡未,這兩行我們重復(fù)了無數(shù)遍的代碼,你果真搞清楚了他們之間的區(qū)別嗎家凯?(已懂的大神請(qǐng)自行return)

我們都知道

frame:決定一個(gè)視圖在它父視圖上的顯示區(qū)域和大小缓醋,以父視圖左上角為原點(diǎn)(0,0)
bounds:以自己左上角為原點(diǎn)(0,0),并可以設(shè)置自身尺寸大小绊诲。

好像我們了解的就僅止于此了

我們現(xiàn)有的開發(fā)在使用bounds好像總有一條神秘的命令指揮著我們:CGRect的(x送粱、y)一定要為(0,0)掂之,否則便會(huì)有不好的事情的發(fā)生

//我們一直都在這么做抗俄,卻不知道為什么
self.XXView.bounds = CGRectMake(0, 0, 100, 100);

事實(shí)上,你如果不設(shè)為(0世舰,0)动雹,確實(shí)有不好的事情發(fā)生。我們用如下代碼驗(yàn)證:

   //創(chuàng)建紅色view
    UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];
    //設(shè)置bounds,x,y分別為20跟压,20胰蝠,寬高不變
    redView.bounds = CGRectMake(20, 20, 200, 200);
    redView.backgroundColor = [UIColor redColor];
    //把紅色view添加到控制器view上
    [self.view addSubview:redView];
    
    //創(chuàng)建紫色view
    UIView *purpleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
    purpleView.backgroundColor = [UIColor purpleColor];
    //把紫色view添加到紅色view上
    [redView addSubview:purpleView];

運(yùn)行頁(yè)面結(jié)果如下:

imgae1.png

我們會(huì)看到:紫色view的frame(x,y)雖然設(shè)為(0震蒋,0)茸塞,但它的左上角卻不在父視圖左上角,而是偏離出父視圖外面去了

為什么查剖,我們只是改變了bounds的x钾虐、y而已

好吧,是時(shí)候再給bounds做一層注釋了:

bounds決定了本地坐標(biāo)系統(tǒng)的位置和大小

這句話怎么理解呢笋庄?
1效扫、我們知道倔监,坐標(biāo)系最重要的是確定原點(diǎn)(0,0)荡短,以哪里為原點(diǎn)才能知道一個(gè)view的左上角從哪里開始擺放丐枉。
2、view本地坐標(biāo)系就是它自身的坐標(biāo)系掘托,這個(gè)坐標(biāo)系是相對(duì)于它的子視圖而言瘦锹,即本地坐標(biāo)系作用于子視圖。bounds的x,y決定本地坐標(biāo)系的坐標(biāo)原點(diǎn)闪盔,系統(tǒng)默認(rèn)為(0弯院,0)。
3泪掀、上面紅色view的bounds(x听绳,y)設(shè)為了(20,20)异赫,也就是它的坐標(biāo)原點(diǎn)變成了(20椅挣,20)。
4塔拳、通俗一點(diǎn)的理解鼠证,子視圖若要處于紅色view左上角原點(diǎn)位置,那么它frame的(x靠抑,y)要為(20量九,20)。但是紫色view的(x颂碧,y)被設(shè)為了(0荠列,0),所以我們要找到坐標(biāo)系(0载城,0)位置肌似。即在原點(diǎn)處,向左移動(dòng)20个曙,向上移動(dòng)20锈嫩,就是(0,0)位置垦搬。比較繞呼寸,請(qǐng)參照下圖理解:

image2.png

上面只是改變了bounds的x和y,若width和height也改呢

我們用代碼作如下驗(yàn)證:

  //創(chuàng)建紅色view
    UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];
    //打印此時(shí)的frame
    NSLog(@"log1:%@",NSStringFromCGRect(redView.frame));
    //設(shè)置bounds,x,y分別為20猴贰,20对雪,寬高為300,300
    redView.bounds = CGRectMake(20, 20, 300, 300);
    //打印設(shè)置完bounds后的frame
     NSLog(@"log2:%@",NSStringFromCGRect(redView.frame));
    redView.backgroundColor = [UIColor redColor];
    //把紅色view添加到控制器view上
    [self.view addSubview:redView];

打印結(jié)果:

2016-08-23 10:52:30.926 frame和bounds區(qū)別[1038:38905] log1:{{50, 100}, {200, 200}}
2016-08-23 10:52:30.927 frame和bounds區(qū)別[1038:38905] log2:{{0, 50}, {300, 300}}

我們會(huì)發(fā)現(xiàn):review的frame不僅width米绕、height變了瑟捣,x馋艺,y也變了,從之前的(50迈套,100)捐祠,變成了(0,50)桑李,x踱蛀、y都減少了50。

由此我們知道贵白,改變bounds的width和height率拒,不僅會(huì)影響frame的width和height(兩者的width和height保持一致),還會(huì)影響frame的x禁荒,y猬膨。這種影響是隨著bounds的width和height增加或減少,平均擴(kuò)充或縮減四周的區(qū)域呛伴。

用上面的例子解釋勃痴,bounds寬高都增加了100,所以會(huì)向四周平均擴(kuò)充區(qū)域热康,在原來的基礎(chǔ)上召耘,往上、往下褐隆、往左、往右各擴(kuò)充50剖踊,所以x庶弃、y都會(huì)減少50。

總結(jié)

bounds的有以下兩個(gè)特點(diǎn):

1. 它可以修改自己坐標(biāo)系的原點(diǎn)位置德澈,影響“子view”的顯示位置歇攻。

2. bounds,它可以通過改變寬高梆造,改變自身的frame缴守,進(jìn)而影響到再父視圖的顯示位置和大小。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末镇辉,一起剝皮案震驚了整個(gè)濱河市屡穗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忽肛,老刑警劉巖村砂,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異屹逛,居然都是意外死亡础废,警方通過查閱死者的電腦和手機(jī)汛骂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來评腺,“玉大人帘瞭,你說我怎么就攤上這事≥锛ィ” “怎么了蝶念?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)诈悍。 經(jīng)常有香客問我祸轮,道長(zhǎng),這世上最難降的妖魔是什么侥钳? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任适袜,我火速辦了婚禮,結(jié)果婚禮上舷夺,老公的妹妹穿的比我還像新娘苦酱。我一直安慰自己,他們只是感情好给猾,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布疫萤。 她就那樣靜靜地躺著,像睡著了一般敢伸。 火紅的嫁衣襯著肌膚如雪扯饶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天池颈,我揣著相機(jī)與錄音尾序,去河邊找鬼。 笑死躯砰,一個(gè)胖子當(dāng)著我的面吹牛每币,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琢歇,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼兰怠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了李茫?” 一聲冷哼從身側(cè)響起揭保,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涌矢,沒想到半個(gè)月后掖举,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年塔次,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了方篮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡励负,死狀恐怖藕溅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情继榆,我是刑警寧澤巾表,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站略吨,受9級(jí)特大地震影響集币,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翠忠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一鞠苟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秽之,春花似錦当娱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至河质,卻和暖如春冀惭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掀鹅。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工云头, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淫半。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像匣砖,于是被迫代替她去往敵國(guó)和親科吭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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