Iphone 如何使用子类化定制CALayer

Iphone 如何使用子类化定制CALayer,iphone,calayer,quartz-graphics,cashapelayer,Iphone,Calayer,Quartz Graphics,Cashapelayer,在UIView上有许多Calayer。每个CALayer由三层组成。CAShapeLayers的路径属性由UIBezierPath组成 我的目标是,当我点击CALayer时,我想得到我在绘制UIBezierPath时使用的点。为此,我考虑将CALayer子类化,该类具有NSMutableArray来存储点。我将保存点,当我在特别CALayer绘制。所以每当我点击特定的CALayer,我就会得到与之相关的分数。我还想给每个CALayer贴标签。我不知道怎么做 第二种方法是使用CALayer的内置属

在UIView上有许多Calayer。每个CALayer由三层组成。CAShapeLayers的路径属性由UIBezierPath组成

我的目标是,当我点击CALayer时,我想得到我在绘制UIBezierPath时使用的点。为此,我考虑将CALayer子类化,该类具有NSMutableArray来存储点。我将保存点,当我在特别CALayer绘制。所以每当我点击特定的CALayer,我就会得到与之相关的分数。我还想给每个CALayer贴标签。我不知道怎么做

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


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

您需要使用包含CALayer的UIView来处理触摸事件,CALayer没有内置触摸事件<代码>-(CALayer*)点击测试:(CGPoint)点返回触摸事件中点所在的“最深”层。因此,如果调用
[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的点,你输入到它。你能做的最好的事情就是从路径中获取信息。所以,正如您所说,最好的办法是将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(或大多数其他核心图形结构)存储在NSValue中,并将其放入数组。

我实际上想从包含路径绘制的CALayer中检索所有点。怎么做?哎呀,对不起。误读了你的问题。希望我的编辑能有所帮助。注意-drawInContext:在CAShapeLayer中不会被调用。要详细说明吗?未显式调用它,但如果使用正确,它将在对CALayerSubclass对象调用“setNeedsDisplay”之后调用。@如果将其帧大小(宽度/高度)设置为非零值,则会在CAShapeLayer中调用ProudMember-DrawInText