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