1

UIViewには、いくつかのCALayerがあります。各CALayerはCAShapeLayersで構成されています。CAShapeLayersのパスプロパティはUIBezierPathで構成されています。

私の目的は、CALayerをタップしたときに、UIBezierPathの描画で使用したポイントを取得することです。そのために、ポイントを格納するためのNSMutableArrayを持つCALayerをサブクラス化することを考えました。特にCALayerを描画するときにポイントを節約します。したがって、特定のCALayerをタップするたびに、それに関連付けられたポイントを取得します。また、各CALayerにタグを付けたいと思います。私はこれを行う方法がわかりません。

2番目の方法は、CALayerの組み込みプロパティを使用して、CALayerでキャプチャされたポイントを取得することです。しかし、私はこの種の特性を知りません。

このタスクを実行する方法についてあなたのアイデアを共有してください。

4

1 に答える 1

2

タッチイベントを処理するには、CALayerを含むUIViewを使用する必要があります。CALayersには組み込みのタッチイベントはありません。- (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に入力したポイントから抜け出す方法はありません。あなたができる最善のことは、パスから情報を取得することについてのこれらの方法です。したがって、あなたが言ったように、最善の策は、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]];  
    ...
}

すべてのCGPoint(または他のほとんどのコアグラフィックス構造)をNSValueに格納し、それを配列にスローするだけです。

于 2012-01-19T15:03:58.887 に答える