iOS 高级核心动画 day02 – 布局、锚点

时间:2021-7-20 作者:qvyue

一、布局和锚点

1. UIView 有三个布局属性分别是啥?CALayer 有三个重要的布局属性分别是啥?

  • UIView: frame、bounds、center。
  • CALayer:frame、bounds、position。
  • centerposition 都是代表了相对父图层 anchorPoint 所在的位置。
iOS 高级核心动画 day02 -  布局、锚点
image.png

2.UIView 的布局属性,实际上在操作谁?

  • UIView 的 frame、bounds、center 属性仅仅是存取方法,当操作视图的 frame,实际上是在改变位于视图下方的 CALayer 的 frame,不能够独立于图层之外改变视图的 frame。

3.对于视图或者图层来说,frame 是固定属性(会不会受到其他属性影响)吗?frame 和 bounds 的宽高一定相等吗?

  • 对于视图或者图层来说,frame 并不是一个非常清晰的属性,它其实是一个虚拟属性,是根据 bounds,position 和 transform 计算而来,所以当其中任何一个值发生改变,frame 都会变化。
  • frame 实际上代表了覆盖在图层旋转之后的整个轴对其的矩形区域,也就是 frame 和 bounds 的宽高可能不一致
iOS 高级核心动画 day02 -  布局、锚点
image.png

4.视图的 center 属性和图层的 position 属性指定了谁(那个属性)相对于父图层的位置?

  • 指定了 anchorPoint 相对于父图层的位置,anchorPoint 使用的是 单位坐标系,默认值是 {0.5,0.5}。
  • 理解下图
iOS 高级核心动画 day02 -  布局、锚点
image.png

5.什么情况下我们需要改变 anchorPoint(至少收一个例子)?

  • 比如实现时钟的 时针、分针、秒针 绕着非中心点旋转的时候,我们就需要改变视图的 anchorPoint 属性
iOS 高级核心动画 day02 -  布局、锚点
image.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 属性可以改变屏幕上图层的顺序,但是不能改变事件传递的顺序。
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。