view的大小,位置

2021-09-02 11:07:00 字數 2822 閱讀 5556

下面有幾個比較重要的關於view的大小以及位置的屬性

uiscreen.mainscreen.bounds

不包括狀態列的大小(由於狀態列高度為20,所以height也就比bounds小20了),當狀態列隱藏時,也就跟bounds一樣了。

uiview的大小與位置,

大小有本uiview.bounds.size來控制

位置由本uiview.center來控制

本uiview.center的數值是本uiview相對于父uiview的座標系遠點的距離

本uiview.center在本uiview中的位置由layer.anchorpoint來控制(不要想當然的認為center就是正中心)

從結果上來看uiview.frame.x,uiview.frame.y是uiview左上角相對于父uiview的座標原點的距離,uiview.frame.width =uiview.bounds.width,uiview.frame.height=uiview.bounds.height

所以可以理解為uiview.frame只是設定uiview大小和位置後的屬性體現,然而由於他們之間的可逆計算關係,也可以通過設定frame來改變,uiview的大小和位置,也算是屁股決定腦袋吧。

下面是他們的對應關係

uiview.frame.x = uiview.center.x - uiview.bounds.width * uiview.layer.anchorpoint.x

uiview.frame.y = uiview.center.y - uiview.bounds.width * uiview.layer.anchorpoint.y

可以看出center在uiview的點位置實際上是由anchorpoint決定的,如果anchorpoint是[0,0],那麼center的位置就是在uiview的左上角,如果anchorpoint是[1,1],那麼center就是在uiview的右下角

uiview.center.x = uiview.frame.x + uiview.frame.width * uiview.layer.anchorpoint.x

uiview.center.y = uiview.frame.y + uiview.frame.width * uiview.layer.anchorpoint.y

因為uiview.frame.width==uiview.bounds.width,uiview.frame.width==uiview.bounds.width,所以上面的關係很明確

1.想讓子uiview統一變更一下螢幕位置,可以調整一下本uiview的bounds.origin大小,這個值代表本uiview在自己座標系的位置(說起來有點兒繞),改變bounds.origin後,本uiview本身是沒什麼位置變化的,那麼相對的等於其座標系向著相反方向移動了,因為子檢視是跟著父檢視的座標系走的,那麼就相當於子檢視也都跟著向著相反方向移動。

例如檢視viewa的子檢視viewb,預設viewa.bounds.origin =(0, 0),如果設定為viewa.bounds.origin =(5, 5),說明viewa相對於其座標係向右下方分別移動了5個點,viewa在螢幕上的位置沒變,那麼相當於viewa的座標係向左上方分別移動了5個點,也就是檢視viewb在螢幕上的位置向左上方分別移動了5個點。

大家都用過uiscrollview,其實它本身就是簡單的uiview,通過新增一些方法,來控制其bounds.origin屬性,然後整體移動其子檢視大小,從而起到滾動子檢視的效果。

詳細可以參照這片文章

理解 scroll views

改變uiview.center在本uiview座標系的位置,可以調整layer.anchorpoint,當對本uiview按比例擴大縮小,或者旋轉時,都是以這個layer.anchorpoint為基準的。注意單獨設定layer.anchorpoint後,uiview.frame.x和y也會跟著變,而uiview.center的數值不會變。(從這點兒也可以看出決定uiview位置的是center和anchorpoint,而frame只是乙個結果屬性)

關於檢視座標的轉換

檢視的座標都是相對於其父檢視座標系的

那麼檢視在其它檢視的座標系中的位置,就需要進行位置轉換。

有兩個函式專門進行這種轉換

func

convertrect(_rect: cgrect,toviewview: uiview?) -> cgrect

func

convertrect(_rect: cgrect,fromviewview: uiview?) -> cgrect

這兩個方法是等價的,主要看是物件哪個檢視來呼叫了。

比如viewa.convertrect(rect, toview:viewb)

意思就是在檢視viewa裡的乙個矩形框(包括座標和寬高)在viewb座標系的位置

等價的另外一種寫法

viewb.convertrect(rect, fromview:viewa)

根據文件要求viewa和viewb都必須在同乙個uiwindow系統裡。

所以猜想,其實都是先轉換到uiwindow座標系,然後再轉換到物件view的座標的。

如果是這樣的寫法

viewa.convertrect(viewc.frame, toview:viewb)

這通常指的是viewc是viewa的直接子檢視,得出viewc如果是在viewb座標系的位置,viewc和viewb只要在同乙個uiwindow就可以了,他倆之間可以有也可以沒有所屬關係。

View 的位置引數

view 的位置主要由它的四個頂點來決定,分別對應於view的四個屬性 top left right bottom,其中top是左上角縱座標,left是左上角橫座標,right是右下角橫座標,bottom是右下角縱座標。需要注意的是,這些座標都是相對於view的父容器來說的,因此它是一種相對座標,v...

View的位置引數

view的位置主要由它的四個頂點來決定,分別對應於view的四個屬性 top left right bottom。需要注意的是,這些座標都是相對於view的父控制項來說的,因此它是一種相對座標。上圖很清楚的展示了view的位置座標和父容器的關係,motionevent獲取位置與view提供的方法的關...

View的事件體系之View的位置引數

如圖所示,為view的位置座標與父容器的關係圖,此圖 於老任的 android開發藝術探索 這本書,感興趣的同學可以去看下,以此我們來簡單介紹下view的位置引數的相關知識。首先是4個基本屬性top left right bottom 如圖,這幾個屬性,都是view相對于父容器的資訊 top 左上角...