在UIView上有很多CALayers。每个CALayer都包含CAShapeLayers。 CAShapeLayers的path属性由UIBezierPath组成。
我的目标是当我点击CALayer时,我想获得我在UIBezierPath绘图中使用的点数。为此我想到了子类化CALayer,它有NSMutableArray来存储点。当我特别在绘制CALayer时,我会保存积分。因此,每当我点击特定的CALayer时,我都会得到与此相关的点数。另外,我想给每个CALayer提供标签。我不知道该怎么做。
第二种方法是使用CALayer的内置属性,它会给我在CALayer中捕获的点数。但我不知道这种财产。
请分享您的想法如何完成此任务?
答案 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中,然后将其放入数组中。