一、布局和锚点
1. UIView 有三个布局属性分别是啥?CALayer 有三个重要的布局属性分别是啥?
-
UIView:
frame、bounds、center。 -
CALayer:
frame、bounds、position。 -
center
和position
都是代表了相对父图层anchorPoint
所在的位置。
![](https://img.haomeiwen.com/i13946897/14ed2dbb458880ee.png)
2.UIView 的布局属性,实际上在操作谁?
- UIView 的 frame、bounds、center 属性仅仅是
存取方法
,当操作视图的 frame,实际上是在改变位于视图下方的 CALayer 的 frame,不能够独立于图层之外改变视图的 frame。
3.对于视图或者图层来说,frame 是固定属性(会不会受到其他属性影响)吗?frame 和 bounds
的宽高一定相等吗?
- 对于视图或者图层来说,frame 并不是一个非常清晰的属性,它其实是一个虚拟属性,是根据 bounds,position 和 transform 计算而来,所以当其中任何一个值发生改变,frame 都会变化。
- frame 实际上代表了覆盖在图层旋转之后的整个轴对其的矩形区域,也就是
frame 和 bounds
的宽高可能不一致
![](https://img.haomeiwen.com/i13946897/409ccc34be9fefcf.png)
4.视图的 center 属性和图层的 position 属性指定了谁(那个属性)相对于父图层的位置?
- 指定了 anchorPoint 相对于父图层的位置,anchorPoint 使用的是
单位坐标系
,默认值是 {0.5,0.5}。 - 理解下图
![](https://img.haomeiwen.com/i13946897/2552750d503c73fa.png)
5.什么情况下我们需要改变 anchorPoint(至少收一个例子)?
- 比如实现时钟的
时针、分针、秒针
绕着非中心点旋转的时候,我们就需要改变视图的anchorPoint
属性
![](https://img.haomeiwen.com/i13946897/a540ce5ba865229b.png)
二、坐标系 && Hit Testing
1. iOS 的坐标系是屏幕的哪个点为坐标原点?
- iOS 坐标系是屏幕的左上角为坐标原点
2. UIView 是二维坐标系吗?CALayer 是几维坐标系?
- UIView 是严格的
二维坐标系
。 - CALayer 存在于一个
三维空间当中
,CALayer 还有另外两个属性,zPosition 和 anchorPointZ,二者都是在 Z 轴上描述图层位置的浮点类型。 -
注意:
这里并没有更深的属性来描述由宽和高做成的bounds
了,图层是一个完全扁平的对象,你可以把它们想象成类似于一页二维的坚硬的纸片,用胶水粘成一个空洞,就像三维结构的折纸一样。
3. 默认情况下 UIView 或者 CALayer 的出现顺序是什么决定的?
- 通常,图层是根据它们子图层的
sublayers
出现的顺序来绘制的 - 也就是所谓的
画家算法
--就像一个画家在墙上作画,后被绘制上的图层将会遮盖住之前的图层。
4. 如果不改变图层中 sublayers 顺序,如何将指定图层优先展示?
- 可以通过 layer.zPosition 来控制
-
需要注意:
zPosition 属性只能调整同级别的视图对象层级关系,不能调整父子关系的视图层级。 - 即:父视图始终是优先绘制的,位于底部。子视图的绘制在父视图之后,位于父视图的上层。
5. 如果一个 UIView 里面有多个 layer,那么如何判断哪个 layer 被点击呢?
-
CALayer
并不关心任何响应链事件,所以不能直接处理触摸事件或手势。 - 方法一:
CALayer
可以结合-containsPoint:
和convertPont:fromeLayer:
方法进行判断最终是哪个 layer 被点击了。 - 方法二:
CALayer
也可以调用-hitText:
方法,来决定最终相应的 layer -
注意:
zPosition 属性可以改变屏幕上图层的顺序,但是不能改变事件传递的顺序。
网友评论