frame 和 bounds 简介
- frame: 该 view 在父View 坐标系中的位置和大小.(参照点是,父视图的坐标系)
- bounds: 该 view 在本地坐标系中的位置和大小.(参照点是,本地坐标系,相当于view 自己的坐标系,以0,0点为起点).
本地坐标系的关键就是知道其原点(0,0)在父坐标系中的什么位置(这个位置是相对于父 view 的本地坐标系而言,最终的父 view 就是 UIWindow, 它的本地坐标系原点就是屏幕的左上角)
参考:https://www.jianshu.com/p/964313cfbdaa 中的示例
通过修改 view 的 bounds 属性可以修改本地坐标系的原点位置,进而影响到子 view 的显示位置
bounds 的使用场景
scrollView 中的原理就是不断改变自己的 bounds.
scrollView不断改变自己的 bounds, 从而改变 scrollView 上的子 View和 frame ,他们的 frame 始终在最顶级 view(window)的 frame 内部,这样就可以始终看到内容.
在 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.
总结
- frame 是参考父 view 的坐标系来设置自己左上角的位置.
- 设置 bounds 可以修改自己坐标系的原点位置,进而影响到其"子 view"的显示位置.
参考:https://www.jianshu.com/p/964313cfbdaa
iOS中 convertPoint 坐标转换规律
参考:https://www.jianshu.com/p/f180597737bf