iOS開發(fā)frame和bounds使用示例詳解
簡述
Frame: 視圖的位置和大小使用是父視圖的坐標系,所以將視圖放置在父級中這一點就很重要。 Bounds:視圖的位置和大小,使用的是其自己的坐標系,而對于這一點而言將視圖的內(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 坐標會在父視圖中移動它。但是視圖本身看起來仍然完全一樣。Bounds并沒有不同。到目前為止,我們看到的Frame和Bounds的寬度和高度一直是完全相同的。然而這并不總是正確的。下面看看如果旋轉(zhuǎn)視圖片會發(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ū)別。

視圖的框架被定義為該視圖相對于其父坐標系的最小邊界框,包括應(yīng)用于該視圖的任何變換。在這里,可以看到邊界大小和幀大小完全不同。這一點非常重要:視圖的框架是相對于其父級坐標系的位置和大小。視圖的邊界是相對于其自身坐標系的位置和大小。圖中兩個不同坐標系(黑色和藍色的)可以幫我們更好地理解。
文檔里說:Note: When modifying the transform property of your view, all transformations are performed relative to the center point of the view.,修改
transform視圖的屬性時,所有轉(zhuǎn)換都是相對于視圖的中心點執(zhí)行的。
也就是說,我們進行transform后,再去修改視圖位置最好使用center屬性來修改。
到目前為止,Bounds原點是一直停留在 (0, 0)的,不過也不一定是這樣的。如果我們的視圖有一個很大的子視圖,它太大而無法一次顯示呢?
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"]];

相當于下圖效果:

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

相當于:

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

