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)文章
iOS開發(fā)中ViewController的頁面跳轉(zhuǎn)和彈出模態(tài)
這篇文章主要介紹了iOS開發(fā)中ViewController的頁面跳轉(zhuǎn)和彈出模態(tài),ViewController是MVC開發(fā)模式中一個重要的類,需要的朋友可以參考下2015-10-10iOS關(guān)鍵字static extern const使用示例詳解
這篇文章主要為大家介紹了iOS關(guān)鍵字static extern const使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11ios開發(fā):一個音樂播放器的設(shè)計與實現(xiàn)案例
本篇文章主要介紹了ios開發(fā):一個音樂播放器的設(shè)計與實現(xiàn)案例,具有一定的參考價值,有需要的小伙伴可以參考下。2016-11-11iOS基礎(chǔ)知識之@property 和 Ivar 的區(qū)別
這篇文章主要介紹了iOS基礎(chǔ)知識之@property 和 Ivar 的區(qū)別介紹,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08iOS在頁面銷毀時如何優(yōu)雅的cancel網(wǎng)絡(luò)請求詳解
這篇文章主要給大家介紹了關(guān)于iOS在頁面銷毀時如何優(yōu)雅的cancel網(wǎng)絡(luò)請求的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05ios UITableView 自定義右滑刪除的實現(xiàn)代碼
這篇文章主要介紹了ios UITableView 自定義右滑刪除的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07Objective-C中利用正則去除非數(shù)字字母漢字方法實例
正則表達式對我們?nèi)粘i_發(fā)來說是必不可少的,下面這篇文章主要給大家介紹了關(guān)于Objective-C中如何利用正則去除非數(shù)字字母漢字的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06