9

draw rect をオーバーライドしてスパイダー チャートを作成しました。コア グラフィック CAShapeLayer を使用して領域を描画しています。画面上に複数の CAShapeLayer 領域が作成されています。ユーザーがタッチしたときにどのレイヤーがタッチされたかを検出したいのですが...方法がわからない?

4

2 に答える 2

20

まず、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;
                }
            }
        }
    }
}
于 2012-04-14T16:58:08.527 に答える
0

迅速な回答のために、これはタッチが始まると beginTracking です。追跡を続ける場合に備えて、continueTracking を実装することもできます。

どのように機能するか、beginTracking 内のタッチ位置を取得して確認します。タッチしたポイントがレイヤー フレームに含まれている場合は、ステートメントが出力されます。すべてのレイヤーを確認できるのと同じ方法

override open func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
     let loaction = touch.location(in: self)
     //update yourLayer with your layer name
     if yourLayer.frame.contains(previousLoaction) { 
        Print("Touch is inside yourLayer layer")
     }
}
于 2018-07-08T14:25:48.370 に答える