2011-11-28 8 views
1

私はあなたのために簡単な質問があります。ShapeLayerのHitTestが私のために働いていない

私は枠を設定するshapeLayerを持っています。 次に、私はshapeLayer.pathに設定したUIBezierPathを使ってフレームコンテンツの中に形を描きます。

質問はどのようにして形状の内側のタップを真とし、形状の外を偽と検出するのですか?

私はクレイジーなもののすべての種類を試してきたが、どれも

-(Boolean) isPoint:(CGPoint)point InsideShape:(CSAbstractShapeLayer*) shapeLayer fromSuperLayer:(CALayer*) sLayer 
{ 
    CGPoint locationPoint = point; 
    locationPoint   = [sLayer convertPoint:locationPoint toLayer:shapeLayer];   
    CGAffineTransform at = shapeLayer.affineTransform;    
    return CGPathContainsPoint([shapeLayer path],&at, locationPoint, NO);  
} 


-(Boolean) isPoint:(CGPoint)point InsideShape:(CSAbstractShapeLayer*) shapeLayer fromSuperLayer:(CALayer*) sLayer 
{ 
    CGPoint locationPoint = point;   
    locationPoint   = [sLayer convertPoint:locationPoint toLayer:shapeLayer];   
    return [[UIBezierPath bezierPathWithCGPath:shapeLayer.path] containsPoint:locationPoint];  
} 


-(Boolean) isPoint:(CGPoint)point InsideShape:(CSAbstractShapeLayer*) shapeLayer fromSuperLayer:(CALayer*) sLayer 
{ 
    CGPoint locationPoint = point;   
    locationPoint   = [sLayer convertPoint:locationPoint toLayer:shapeLayer];   
    CGRect theRect = CGPathGetBoundingBox(shapeLayer.path); 
    return CGRectContainsPoint(theRect, locationPoint);  
} 

注1機能していない:内部に斜線で 権利を四角形を描く私はまだ画像を投稿することができないようですが私はYESと外側(線の左側と矩形の外)としてタップの内側を検出する必要があります

注2:それは役立つかもしれないが、私はそれを理解できないかもしれない....私はあなたがshapeLayerを作成し、shapeLayer.pathにCGPathを追加し、フレームを提供しないと、フレームとthの境界shapeLayerは[0,0,0,0]です。したがって、シェイプがスクリーン上にレンダリングされても、[view.layer hitTest:point]はshapeLayerをターゲットとして検出しません。このため、私はshapeLayerにフレームとバウンドを提供しました。

ありがとうございました!

答えて

0

長い話を短くするために、層レベルで

は、私はビュー(locationInView)から得たポイントを使用していたし、その後層への変換を行うが、この層は、それゆえ私の親層を持っていましたその方法を見て、私は他の日

-(Boolean) isPoint:(CGPoint)point InsideShape:(CSAbstractShapeLayer*) shapeLayer fromSuperLayer:(CALayer*) sLayer 
{ 

  
    CGPoint locationPoint   = point; 

        
    locationPoint           = [sLayer convertPoint:locationPoint toLayer:shapeLayer];       

  
    return [[UIBezierPath bezierPathWithCGPath:shapeLayer.path] containsPoint:locationPoint];     

} 

あなたを送った場合、私は、次の

    をしなければならなかったので、2つの変換

    を行うために必要な

  1. locationPoint = [ sLayer.superlayer convertPoint: locationPoint toLayer: sLayer];

  2. locationPoint = [ sLayer convertPoint: locationPoint toLayer: shapeLayer];

  3. それから誰か

    を助けるchildLayer

    ホープその後、自分自身へのparentLayerスーパーレイヤからそう

関連する問題