1、区别
frame: 该view在父view坐标系统中的位置和大小。(参照点是,父亲的坐标系统)
bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统)。
其实本地坐标系统的关键就是要知道的它的原点(0,0)在父坐标系统中的什么位置(这个位置是相对于父view的本地坐标系统而言的,最终的父view就是UIWindow,它的本地坐标系统原点就是屏幕的左上角了)。
通过修改view的bounds属性可以修改本地坐标系统的原点位置。
2、bounds使用场景
滚动 scrollview 时,imageview 的 frame 和 bounds 还有 scrollview 的 frame 是没有改变的。唯一在不断改变的是 scrollview 的 contentoffset 和 bounds,而且两者完全相同。
向上滚动scrollview,我们就不断增加 scrollview 的 bounds 的 y 值,也就是不断把 scrollview 的本地坐标系原点向下偏移(相对于 scrollview 的父 view 的坐标系,y 值越大,越向下偏移)。那么此时 scrollview 的子控件的 frame 设置的 (0,0) 就是不断向上偏移
假设某一时刻 scrollview 的坐标系原点为 (0,100) ,那么scrollview的 (0,0) 位置就是相对于坐标系原点向上偏移 100 的距离,设置 scrollview 的子控件的 frame 为(0,0),就是设置子控件左上角在 scrollview 中的(0,0)位置,那么子控件就会向上偏移 100,你也就看到 scrollview 的内容(子控件)向上滚动的效果。
3、bound 大于 frame
假设设置了控件的 bounds 大于 frame,那么此时会导致 frame 被撑大,frame 的 x,y,width,height 都会改变。
新的frame的size等于bound的size。
新的frame.x = 旧frame.x - (bounds.size.witdh - 旧frame.size.width)/2
新的frame.y = 旧frame.y - (bounds.size.height - 旧frame.size.height)/2
4、bound 具有叠加效应
假设 view1上面添加了 view2,view2 上面添加了 view3。三个 view 的 size 都是(100,100)。
我们设置如下:
view1.bound = (0,100,100,100)
view2.bound = (0,100,100,100)
那么此时 view3.frame = (0,0,100,100),view3 会相对于原来没有设置 view1、view2 的 bound 时的位置向上偏移 200。
参考文档:https://www.jianshu.com/p/964313cfbdaa