3

iPad用のiOS 6.1でアプリを開発しています。と に問題がCALayerありTapGestureRecognizerます。

私は 7CALayers虹を形成しています (すべてのレイヤーは色です)。CAShapeLayerすべてのレイヤーは、からの生成を使用して構築されCGMutablePathRefます。すべて正常に動作します。すべてのレイヤーが画面に描画され、美しい虹が見えます。

今、私は単一の色/レイヤーの上のタップを検出したいと考えています。私はこの方法を試します:

- (void)tap:(UITapGestureRecognizer*)recognizer
{
   //I've had the tapGestureRecognizer to rainbowView (that is an UIView) in viewDidLoad
  CGLayer* tappedLayer = [rainbowView.layer.presentationlayer hitTest:[recognizer locationInView:rainbowView];

  if (tappedLayer == purpleLayer) //for example
         NSLog(@"PURPLE!");
}

このコードが機能しない理由がわかりません! 私はすでにここで他のトピックを赤くしました: すべてがhitTest:このような問題を解決する方法を提案します. しかし、私の場合、望ましい結果を得ることができません。誰でも私を助けることができますか?ありがとう!!

編集:

パスとレイヤーを作成するコードは次のとおりです。

- (void)viewDidLoad
{
     //Other layers
     ...
     ...
     //Purple Arc
     purplePath = CGPathCreateMutable();
     CGPathMoveToPoint(purplePath, NULL, 150, 400);
     CGPathAddCurveToPoint(purplePath, NULL, 150, 162, 550, 162, 550, 400);
     purpletrack = [CAShapeLayer layer];
     purpletrack.path = purplePath;
     purpletrack.strokeColor = [UIColor colorWithRed:134.0/255.0f green:50.0/255.0f blue:140.0/255.0f alpha:1.0].CGColor;
     purpletrack.fillColor = nil;
     purpletrack.lineWidth = 25.0;
     [rainbowView.layer insertSublayer:purpletrack above:bluetrack];
}

これが、この問題に対する私の最初のアプローチでした。そして、タッチがうまくいきませんでした。

を使ったメソッドRainbowViewで虹が描かれるクラスも作ってみました。次に、 http://developer.apple.com/library/ios/#documentation/2ddrawing/conceptual/drawingprintingios/BezierPaths/BezierPaths.htmlの「パスでヒット検出を行う」セクションに従います 。この場合、問題はメソッドに渡されるパス変数。渡されたパスとパスを比較しようとしましたが、結果はありません。drawRectUIBezierPathsUIBezierPathRainbowView

パスの代わりに曲線を作成することもできます。この場合、図形の塗りつぶし部分がなく、タッチ領域がストロークに限定されている可能性があります。しかし、どうすればカーブに触れたことを認識できるでしょうか?

私はこれらすべてについてとても混乱しています!!! :D

4

1 に答える 1

2

あなたが直面している問題は、ヒットテスト時にレイヤーのフレーム/境界をチェックしているのであって、シェイプレイヤーのパスをチェックしているのではないということです。

パスがいっぱいになっている場合は、代わりCGPathContainsPoint()にタップがパスの内側にあるかどうかを判断するために使用する必要があります。パスが埋められていないが、ストロークされている場合は、CGPathHitTestingに関するOleBegemannの記事を参照してください。

コードをよりクリーンにするために、独自のサブクラスでヒットテストを実行できます。また、ヒットテスト時にレイヤーがアニメーション化されていない限り、presentationLayerを使用しても意味がありません。

于 2013-02-03T15:55:56.710 に答える