2012-04-14 12 views
8

私はドロー矩形を上書きしてスパイダーチャートを作成しました。私は自分のエリアを描画するためにコア灰色のCAShapeLayerを使用しています、スクリーン上に複数のCAShapeLayerリージョンがあります。ユーザーは触れる...しかし、私はどのように把握することができないのですか?CAShapeLayerタッチを検出する

答えて

16

まず、drawRectでレイヤーを描画するべきではありませんが、それはあなたの質問ではありません。あなたはこのような何かを行うことができ、「触れる」される層を特定するために...

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    for (UITouch *touch in touches) { 
     CGPoint touchLocation = [touch locationInView:self.view]; 
     for (id sublayer in self.view.layer.sublayers) { 
      BOOL touchInLayer = NO; 
      if ([sublayer isKindOfClass:[CAShapeLayer class]]) { 
       CAShapeLayer *shapeLayer = sublayer; 
       if (CGPathContainsPoint(shapeLayer.path, 0, touchLocation, YES)) { 
        // This touch is in this shape layer 
        touchInLayer = YES; 
       } 
      } else { 
       CALayer *layer = sublayer; 
       if (CGRectContainsPoint(layer.frame, touchLocation)) { 
        // Touch is in this rectangular layer 
        touchInLayer = YES; 
       } 
      } 
     } 
    } 
} 
+0

こんにちはジョディ、あなただけOK、私は少しでそれを更新 – user1333444

+0

、より多くの光のための場合の条件内のコードを拡張することができますもっと詳しく。基本的には、シェイプレイヤーの場合、そのパスを照会してそのパスにポイントが含まれているかどうかを確認します。ただし、CGPathContainsPointの一部としてfill-typeを渡す必要があることに注意してください。 ... –

+0

線幅が1より大きい場合、これはボーダー上でのタッチには機能しません。 – jjxtra

関連する問題