本文档是对培训文档
Frame和Bounds.pdf
的补充,基本概念略过。
本文档描述Bounds
的origin
变化,引起的子视图位置移动的过程以及原理。
这里还未探究当旋转缩放等用到矩阵转换
时,frame
的size
与bounds
的size
不一致的情况。
预设
- 预设三种View,
SuperView
、CurrentView
以及SubView
- 统一概念,
SuperView
的坐标系,称为世界坐标系
,具体就是frame
使用的坐标系。 - 统一概念,
CurrentView
的坐标系,称为本地坐标系
,具体就是bounds
使用的坐标系。
参照系
- 世界坐标系,影响的
CurrentView
的显示位置也即本地坐标系
的位置,frame
改变的是CurrentView
的世界坐标系
的位置(绝对位置)。 - 本地坐标系,影响的是
SubView
的显示位置。因为本地坐标系
是SubView
的世界坐标系
,bounds
修改本地坐标系
的坐标原点
,但是本地坐标系
的位置并没有改变(frame
控制)。
依据
- 已知
SetBounds
之后,系统会进行光栅化
处理,把视图展示在屏幕上。可以根据最终视图的显示推理相应原理。
DEMO为例
黄色View是一个ScrollView,1,2,3是三个UIImageView.
通常看到的效果
设置
sv.layer.masksToBounds = NO;
分析
品红色为
SuperView
,黄色SCrollView
为CurrentView
,1,2,3标号的为3个SubView
.
绿色坐标系为CurrentView
的世界坐标系
,蓝色坐标系为CurrentView
的本地坐标系
初始状态
上滑之后
对比两种状态
-
CurrentView
的frame
没有改变,CurrentView
的本地坐标系
的位置也没有变,只有本地坐标系
的原点
的值变了。 -
原点
y值由0变为128,SubView
①图的frame的origin是(0,0)没变,则在y坐标原点
的负方向找到y值为0的地方,移动到对应(0,0)的位置。视觉效果就是向上滚动,超过默认的可视区域
。
结论
- 要改变
CurrentView
的位置,有两种方法。
- 改变
CurrentView
的Frame
(改变自己) - 改变
SuperView
的Bounds
(改变参照物)
-
CurrentView
的Bounds
改变Origin
是更新了本地坐标系
原点的值
,但并没有改变本地坐标系
的位置(蓝色坐标系未动)。坐标原点
作为SubView
的参照物,参照物改变,SubView
的frame
没有变,造成SubView
在CurrentView
中绝对位置的移动。
通俗地讲:
frame
调整自己的位置大小,bounds
调整子视图的位置大小
旋转等矩阵操作是对世界坐标
进行变换,影响到frame
的改变,从而改变当前视图的大小位置等。
Demo
TSScrollViewDemogit
地址。