iOS開發(fā)frame和bounds使用示例詳解
簡述
Frame: 視圖的位置和大小使用是父視圖的坐標(biāo)系,所以將視圖放置在父級中這一點(diǎn)就很重要。 Bounds:視圖的位置和大小,使用的是其自己的坐標(biāo)系,而對于這一點(diǎn)而言將視圖的內(nèi)容或子視圖放置在其自身內(nèi)很重要。
frame和bounds
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; [superView addSubview:imageView];

Frame origin = (0, 0) width = 100 height = 100
Bounds origin = (0, 0) width = 100 height = 100
該圖片中的Frame和Bounds完全相同。
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 50, 100, 100)]; [superView addSubview:imageView];

Frame origin = (10, 50) width = 100 height = 100
Bounds origin = (0, 0) width = 100 height = 100
改變Frame的 x、y 坐標(biāo)會(huì)在父視圖中移動(dòng)它。但是視圖本身看起來仍然完全一樣。Bounds并沒有不同。到目前為止,我們看到的Frame和Bounds的寬度和高度一直是完全相同的。然而這并不總是正確的。下面看看如果旋轉(zhuǎn)視圖片會(huì)發(fā)生什么。
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 50, 100, 100)]; [superView addSubview:imageView]; imageView.transform = CGAffineTransformMakeRotation(M_PI * 0.05);


可以看到Bounds仍然相同,但是Frame已經(jīng)發(fā)生了更改?,F(xiàn)在更容易看出frame和bounds之間的區(qū)別。

視圖的框架被定義為該視圖相對于其父坐標(biāo)系的最小邊界框,包括應(yīng)用于該視圖的任何變換。在這里,可以看到邊界大小和幀大小完全不同。這一點(diǎn)非常重要:視圖的框架是相對于其父級坐標(biāo)系的位置和大小。視圖的邊界是相對于其自身坐標(biāo)系的位置和大小。圖中兩個(gè)不同坐標(biāo)系(黑色和藍(lán)色的)可以幫我們更好地理解。
文檔里說:Note: When modifying the transform property of your view, all transformations are performed relative to the center point of the view.,修改
transform視圖的屬性時(shí),所有轉(zhuǎn)換都是相對于視圖的中心點(diǎn)執(zhí)行的。
也就是說,我們進(jìn)行transform后,再去修改視圖位置最好使用center屬性來修改。
到目前為止,Bounds原點(diǎn)是一直停留在 (0, 0)的,不過也不一定是這樣的。如果我們的視圖有一個(gè)很大的子視圖,它太大而無法一次顯示呢?
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(150, 100, 120, 200)]; [self.view addSubview:view2]; view2.clipsToBounds = YES; // view2.bounds = CGRectMake(50, 0, 120, 200); UIImageView *imageView2 = [[UIImageView alloc] initWithFrame:CGRectMake(-50, 50, 200, 200)]; [view2 addSubview:imageView2]; [imageView2 setImage:[UIImage imageNamed:@"pic.jpg"]];

相當(dāng)于下圖效果:

此時(shí)bounds的原點(diǎn)為(0, 0)。倘若我們現(xiàn)在改變bounds的原點(diǎn),會(huì)發(fā)生什么呢?
view2.bounds = CGRectMake(50, 0, 120, 200);

相當(dāng)于:

從原坐標(biāo)原點(diǎn)相對于大子視圖的位置,再進(jìn)行相對的移動(dòng)。視圖在父視圖中沒有移動(dòng),但是視圖里面的內(nèi)容發(fā)生了變化。這其實(shí)和我們常用的UIScrollView系列控件的思想是一樣的。大的子視圖相當(dāng)于畫布,改變bounds更改的是顯示畫布的區(qū)域。
何時(shí)使用Frame,何時(shí)使用Bounds
由于frame關(guān)聯(lián)視圖在其父視圖中的位置,因此您在進(jìn)行向外更改時(shí)會(huì)使用它,例如更改其寬度或查找視圖與其父視圖頂部之間的距離。
使用bounds時(shí),你正在向內(nèi)變化,就像畫的東西或視圖中安排子視圖。如果您對它進(jìn)行了一些轉(zhuǎn)換,還可以使用bounds來獲取視圖的大小。
以上就是iOS開發(fā)frame和bounds使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于iOS開發(fā)frame bounds的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android開發(fā)筆記之簡單基站定位程序的實(shí)現(xiàn)
這篇文章主要介紹了Android開發(fā)筆記之簡單基站定位程序的實(shí)現(xiàn),詳細(xì)的介紹了基站定位其實(shí)很簡單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-11-11
iOS實(shí)現(xiàn)類似微信和支付寶的密碼輸入框(UIKeyInput協(xié)議)
這篇文章主要介紹了iOS實(shí)現(xiàn)類似微信和支付寶的密碼輸入框,通過UIKeyInput協(xié)議為響應(yīng)者提供簡單的鍵盤輸入的功,再通過CoreGraphics繪制出密碼輸入框,感興趣的小伙伴們可以參考一下2016-08-08
IOS打開照相機(jī)與本地相冊選擇圖片實(shí)例詳解
這篇文章主要介紹了IOS打開照相機(jī)與本地相冊選擇圖片實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06
使用UItableview在iOS應(yīng)用開發(fā)中實(shí)現(xiàn)好友列表功能
這篇文章主要介紹了使用UItableview在iOS應(yīng)用開發(fā)中實(shí)現(xiàn)一個(gè)好友列表功能的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-12-12

