《ios核心动画高级技巧》阅读笔记(2)

第三章 图层集合学

布局

  • frame:图层的相对于父图层的外部坐标
  • bounds:内部坐标
  • center和position:相对于父图层anchorPoint所在的位置
  • 设置视图的frame,bounds和center,也就是相当于设置图层的frame,bounds和position
  • 一般情况下,frame中的size与bounds中的size是相同的,但是当视图旋转时,frame的size和bounds的size就不一样了,如下图

frame&bounds&center

锚点

  • 锚点是相对于父图层anchorPoint所在的位置。
  • 默认,锚点位于图层的中点,可以改变锚点的位置,描点改变,frame也会随之改变。

anchorPoint

  • 改变锚点,position不会改变,但是frame改变了。
  • anchorPoint是View在旋转是的轴点,如果想改变view的旋转轴点,改变anchorPoint即可

坐标系

  • 与UIView一样,CALayer也提供了一套坐标变换的借口
1
2
3
4
- (CGPoint)convertPoint:(CGPoint)p fromLayer:(nullable CALayer *)l;
- (CGPoint)convertPoint:(CGPoint)p toLayer:(nullable CALayer *)l;
- (CGRect)convertRect:(CGRect)r fromLayer:(nullable CALayer *)l;
- (CGRect)convertRect:(CGRect)r toLayer:(nullable CALayer *)l;

翻转的几何结构

  • ios上坐标系原点为左上角,macOS上坐标系原点为左下角。
  • CALayer的geometryFlipped属性决定了图层的坐标是否相对于父图层翻转。

z坐标轴

  • zPosition:表示图层空间z轴上的位置
  • zPosition除了可以改变z轴的位置,还可以用来改变图层的先后顺序,如图,如果设置了绿色view的zPosition,绿色View就可以覆盖在蓝色view之上。但是通过这种方法改变视图的层次,是不能改变视图的响应事件的顺序的。

zPositon

  • anchorPointZ表示z轴上锚点的位置

Hit Testing

  • CALayer不能处理点击事件,但是他有一系列方法帮你处理事件。
  • - (BOOL)containsPoint:(CGPoint)p;用于判断一个点是否属于一个图层
  • - (nullable CALayer *)hitTest:(CGPoint)p;返回被点击的图层
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self.view];

point = [self.layerView convertPoint:point fromView:self.view];
BOOL ret = [self.layerView.layer containsPoint:point];
if (ret) {
NSLog(@"green");
}

point = [self.buleView convertPoint:point fromView:self.layerView];
ret = [self.buleView.layer containsPoint:point];
if (ret) {
NSLog(@"blue");
}

CALayer *layer = [self.view.layer hitTest:point];
if (layer == self.layerView.layer) {
NSLog(@"green");
}
else if(layer == self.buleView.layer) {
NSLog(@"blue");
}

}