frame 与 bounds 的区别和convertPoint坐标转换

frame 和 bounds 简介

frame 与 bounds 的区别和convertPoint坐标转换_第1张图片
image.png
  • 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

你可能感兴趣的:(frame 与 bounds 的区别和convertPoint坐标转换)