iOS核心动画技巧学习 - CALayer处理事件

CALayer 并不关心任何的响应链事件,所以也不能直接处理触摸事件或者手势;但是它有俩个方法帮你处理事件 -containsPointhitTest

-containtPoint
  • 接收一个本图层坐标系下的 CGPoint,如果这个点在图层的 frame 范围内返回 YES
    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
    26
    27
    - (void)viewDidLoad {
    [super viewDidLoad];
    self.blueLayer = [CALayer layer];
    self.blueLayer.frame = CGRectMake(50, 50, 100, 100);
    self.blueLayer.backgroundColor = [UIColor blueColor].CGColor;
    [self.layerView.layer addSublayer:self.blueLayer];
    }
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //使用containsPoint方法
    CGPoint point = [[touches anyObject] locationInView:self.view];
    point = [self.layerView.layer convertPoint:point fromLayer:self.view.layer];
    if ([self.layerView.layer containsPoint:point]) {
    point = [self.blueLayer convertPoint:point fromLayer:self.layerView.layer];
    if ([self.blueLayer containsPoint:point]) {
    NSLog(@"蓝色");
    }else{
    NSLog(@"白色");
    }
    }else{
    NSLog(@"灰色");
    }
    }
hitTest
  • 同样接收一个 CGPoint类型的参数,返回图层本身
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- (void)viewDidLoad {
[super viewDidLoad];
self.blueLayer = [CALayer layer];
self.blueLayer.frame = CGRectMake(50, 50, 100, 100);
self.blueLayer.backgroundColor = [UIColor blueColor].CGColor;
[self.layerView.layer addSublayer:self.blueLayer];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//使用hitTest方法
CGPoint point = [[touches anyObject] locationInView:self.view];
CALayer *layer = [self.layerView.layer hitTest:point];
if (layer == self.blueLayer) {
NSLog(@"蓝色");
}else if(layer == self.layerView.layer){
NSLog(@"白色");
}else{
NSLog(@"灰色");
}
}
这个人很帅<br>他什么都不想说<br>