frame 和 bounds 簡介
- frame: 該 view 在父View 坐標系中的位置和大小.(參照點是,父視圖的坐標系)
- bounds: 該 view 在本地坐標系中的位置和大小.(參照點是,本地坐標系,相當于view 自己的坐標系,以0,0點為起點).
本地坐標系的關(guān)鍵就是知道其原點(0,0)在父坐標系中的什么位置(這個位置是相對于父 view 的本地坐標系而言,最終的父 view 就是 UIWindow, 它的本地坐標系原點就是屏幕的左上角)
參考:http://www.reibang.com/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 設置的(0,0)就是不斷向上偏移的
bounds 大于 frame 的情況
假設設置了控件的 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 的改變會累加
假設 view1上面添加了 view2,view2上面添加了 view3.三個 view 的 size 都是(100,100).
設置如下:
view1.bound = (0, 0, 100, 100)
view2.bound = (0, 100, 100, 100)
那么此時 view3.frame = (0, 0, 100, 100),view3會相對于原來沒有設置 view1,view2的 bound 時的位置向上偏移200.
總結(jié)
- frame 是參考父 view 的坐標系來設置自己左上角的位置.
- 設置 bounds 可以修改自己坐標系的原點位置,進而影響到其"子 view"的顯示位置.
參考:http://www.reibang.com/p/964313cfbdaa