1

CAShapeLayerがhitTestに応答しない理由がわかりません

この関数は常に行きます//タッチは外にあります

CAShapeLayerのタッチを検出するにはどうすればよいですか?

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{{   

    currentPoint = [[touches anyObject] locationInView:self];

    for(CAShapeLayer * self.layer.sublayersのレイヤー){    

        if(layer == shapeLayer){

            if([layer hitTest:currentPoint])
            {{
                //toucheはレイヤー上にあります
            }
            そうしないと {
                //toucheは外にあります
            }

        }

    }       

}
4

2 に答える 2

6

2日間頭を叩いた後、この奇妙なコードを作成することができ、機能しているように見えます。

目標は、CAShapeLayerのテストを行うことでした。CAShapeLayerは画面上を移動しているため、形状は一定の位置にありません。CGPathcurrentPointのヒットテストは簡単ではありません。

任意の入力を自由に追加してください...

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{{   

    CGPoint p = [[touches anyObject] locationInView:self];

    CGAffineTransform transf = CGAffineTransformMakeTranslation(-shapeLayer.position.x、-shapeLayer.position.y);

    if(CGPathContainsPoint(shapeLayer.path、&transf、p、NO)){    

       //タッチはシェイプの内側にあります  
    }   

}
于 2011-02-13T21:48:47.153 に答える
1

以下を参照してください-CAShapeLayersのhitTest()メソッドをオーバーライドします

    // CAShapeLayer path coordinates are relative to the layer
    // so when hit testing to see if the mouse click is inside the path
    // convert the point to layer coordinates like so
    // This assumes the received coordinates are in the layers superlayer coordinates
    // Usually so if they come from a mouse click

    override func hitTest(_ p: CGPoint) -> CALayer? {
        
        let lp = self.convert(p, from: superlayer)
        
        let result = path?.contains(lp) ?? false
        
        return result ? self : nil
            
    }
于 2020-07-13T13:54:09.887 に答える