剖析OC中的bounds與frame的區別

2021-07-02 13:55:24 字數 2457 閱讀 8421

在oc的ui控制項中,我們常常會碰到兩個屬性frame 與bound,前者相對比較好理解,而bound有時候卻比較繞,今天我們來仔細研究下bound的一些特性。

首先,我們來看下下面的**:

通過**,我們可以看出bounds的width值、height值與frame是相等的,只不過origin點的x 、y預設都為0

那麼如果我們修改或者重新賦值了bounds值,會發生哪些影響呢?我們來分情況進行討論:

一 、修改bounds的width值或height值

當我們給one新增** one.bounds = (cgrect);通過bounds我們修改了它的width、height值(小於frame),此時在模擬器中兩個view的位置變成了:

這是因為:

我們通過frame定義了乙個相對父檢視的乙個容器,而bounds顯示的是這個容器的實際區域。當bounds比frame小了,實際的顯示區域就需要調整。需要注意的是在調整的過程中,容器的中心點是不能改變的

以上圖為例,當one.frame =(cgrect)時候,這個容器的中心點座標就是 (100,100),然後我們執行了one.bounds = (cgrect);寬度和高度都小了20,這樣子在保持中心點不變的情況下,上下左右都各自縮短10

同樣的,若執行one.bounds = (cgrect);中心點仍然是不變的,只不過上下左右都各自增加10

在這裡我們看乙個比較極端的情況,若我們不設定frame屬性,直接設定

one.bounds = (cgrect);看看模擬器中的呈像

我們明明設定的width、height是100,而現在卻看來只有50呢?細心的小夥伴們或許已經發現了!當我們沒有設定frame的時候,預設的frame就是(cgrect);這個時候我們的中心點就是父容器的左上角(0,0),bounds在調整的過程中,中心點是不能改變的,所以它從中心,往上下左右增加50。此時,其他的三個部分超出了介面我們是看不到的,只能看到它的右下角。

二 、修改bounds的width值或height值

細心的小夥伴可能發現當我們執行one.bounds = (cgrect);時候,雖然修改了origin的x、y值,但是影象卻沒有任何變化,這是因為:bounds修改了origin值後,它影響的是它的字容器的位置

我們看下面的**

注意:在這裡,我們把uiview two新增到了one中,那麼後者就是前者的父容器,所以two的位置就是參考one的左上角的

綠色小框之所以在紅色框的右下角是因為two.bounds = (cgrect);它到紅色框的左上角都是50

那麼如果此時我們修改了one的bounds,one.bounds = (cgrect);

這是因為bounds描繪的是在本地座標系統中的位置和大小,one.bounds = (cgrect);表示在one這個uiview中,它本地的座標原點是它的左上角,它的子容器在參考座標的時候,都將左上角落定為(0,0)

當我們執行one.bounds = (cgrect);時候,強制將自己座標系的左上角點,改為(-50,-50)。那麼此時的原點,自然就向在右下方偏移(50,50)。

原點既然改變了,綠色小框也需要做出一定的調整

同樣的,如果我們執行one.bounds = (cgrect);

此時,強制將自己座標系的左上角點,改為(50,50),那麼綠色小框剛好移動到這個區域。因為此時的原點是在左上方50那個點

關於ios中bounds與frame

1.ios中的bounds是指相對於檢視自己的座標,所以預設view.bounds.origin 0,0 2.ios中的frame是指相對于父檢視的座標 3.當bounds改變的時候,會影響到frame 比如下面的 cgrect frame cgrectmake 0,0,200,200 uilabe...

frame與bounds的區別

原來你m,frame.size和bounds.size不總是一樣的 在uiviewcontroller的 void willanimaterotationtointe ceorientation uiinte ceorientation tointe ceorientation duration n...

frame與bounds的關係與區別

在設定uiview的位置及尺寸時會使用到frame屬性。但是,容易引起混淆的是另外乙個決定uiview尺寸的bounds屬性。實際上,當我們向bounds實行中設定新的cgrect是,uiview的尺寸也會改變 位置沒變 與設定frame屬性的效果相同。bounds屬性到底是什麼?該如何使用?不多說...