frame 與 bounds 的區(qū)別和convertPoint坐標轉(zhuǎn)換

frame 和 bounds 簡介

image.png
  • frame: 該 view 在父View 坐標系中的位置和大小.(參照點是,父視圖的坐標系)
  • bounds: 該 view 在本地坐標系中的位置和大小.(參照點是,本地坐標系,相當于view 自己的坐標系,以0,0點為起點).

本地坐標系的關(guān)鍵就是知道其原點(0,0)在父坐標系中的什么位置(這個位置是相對于父 view 的本地坐標系而言,最終的父 view 就是 UIWindow, 它的本地坐標系原點就是屏幕的左上角)

參考:http://m.itdecent.cn/p/964313cfbdaa 中的示例

通過修改 view 的 bounds 屬性可以修改本地坐標系的原點位置,進而影響到子 view 的顯示位置

bounds 的使用場景

scrollView 中的原理就是不斷改變自己的 bounds.
scrollView不斷改變自己的 bounds, 從而改變 scrollView 上的子 View和 frame ,他們的 frame 始終在最頂級 view(window)的 frame 內(nèi)部,這樣就可以始終看到內(nèi)容.

在 scrollView 的滑動過程中,不斷增加 scrollView 的bounds 的 y 值,也就是不斷把 scrollView 的本地坐標系原點向下偏移(相對于 scrollView 的父 view 的坐標系, y 值越大,越向下偏移).那么此時 scrollView 的子控件的 frame 設(shè)置的(0,0)就是不斷向上偏移的

bounds 大于 frame 的情況

假設(shè)設(shè)置了控件的 bounds 大于 frame, 那么此時會導致 frame 被撐大, frame 的x,y,width,height 都會改變.

  • 新的 frame 的 size 等于 bounds 的 size.
  • 新的 frame.x = 舊 frame.x - (bounds.size.width - 舊 frame.size.width)/2
  • 新的 frame.y = 舊 frame.y - (bounds.size.height - 舊 frame.size.height)/2

bounds 的改變會累加

假設(shè) view1上面添加了 view2,view2上面添加了 view3.三個 view 的 size 都是(100,100).
設(shè)置如下:

view1.bound = (0, 0, 100, 100)
view2.bound = (0, 100, 100, 100)

那么此時 view3.frame = (0, 0, 100, 100),view3會相對于原來沒有設(shè)置 view1,view2的 bound 時的位置向上偏移200.

總結(jié)

  • frame 是參考父 view 的坐標系來設(shè)置自己左上角的位置.
  • 設(shè)置 bounds 可以修改自己坐標系的原點位置,進而影響到其"子 view"的顯示位置.

參考:http://m.itdecent.cn/p/964313cfbdaa

iOS中 convertPoint 坐標轉(zhuǎn)換規(guī)律

參考:http://m.itdecent.cn/p/f180597737bf

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容