前言
也許你做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é)果如下:
我們會(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)參照下圖理解:
上面只是改變了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)而影響到再父視圖的顯示位置和大小。