如何使用子类定制CALayer

时间:2012-01-18 05:38:27

标签: iphone calayer quartz-graphics cashapelayer

在UIView上有很多CALayers。每个CALayer都包含CAShapeLayers。 CAShapeLayers的path属性由UIBezierPath组成。

我的目标是当我点击CALayer时,我想获得我在UIBezierPath绘图中使用的点数。为此我想到了子类化CALayer,它有NSMutableArray来存储点。当我特别在绘制CALayer时,我会保存积分。因此,每当我点击特定的CALayer时,我都会得到与此相关的点数。另外,我想给每个CALayer提供标签。我不知道该怎么做。

第二种方法是使用CALayer的内置属性,它会给我在CALayer中捕获的点数。但我不知道这种财产。

请分享您的想法如何完成此任务?

1 个答案:

答案 0 :(得分:2)

您需要使用包含CALayer的UIView来处理触摸事件,CALayers没有内置的Touch事件。 - (CALayer *)hitTest:(CGPoint)thePoint返回触摸事件中的点所在的“最深”CALayer。因此,如果您致电[self.layer hitTest:point],它会检查您的所有子图层并返回正确的CALayer

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint point = [[touches anyObject] locationInView:self];
    CALayerSubclass *taplayer = [self.layer hitTest:point]
    NSArray *points = [taplayer getPoints];
}

没有办法摆脱CGPath你输入的点数。关于从路径获取信息,您可以做的最好的事情是these methods。所以,就像你说的那样,你最好的选择是将CALayer子类化,并将你需要的所有信息放在数据结构中以便以后检索。

// .h
@interface CALayerSubclass : CALayer

@property (nonatomic, strong) NSMutableArray *points;

@end

// .m
-(void)drawInContext:(CGContextRef)ctx {
    ...
    [bezierPath addCurveToPoint:controlPoint1:point1 controlPoint2:point2];
    [points addObject:[NSValue valueWithCGPoint:point1]];  
    [points addObject:[NSValue valueWithCGPoint:point2]];  
    ...
}

只需将所有CGPoints(或大多数其他Core Graphics结构)存储在NSValue中,然后将其放入数组中。