2012-02-23 6 views
1

私はCGContextし、以下のようにパス(これはSwbPlateと呼ばれるのCustomViewクラスで起こると引き分けた画像をユーザーがクリックする天気を検出しようとしているので描画UIImageでタッチをゲット:CGContext

SwbPlateImage * image; 
    CGFloat startAngle; 
    CGFloat endAngle; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 


    for (image in plateImages) { 
     endAngle = [EntGeometry pointToRadian:[image endPoint] withCenterPoint:CGPointMake(self.bounds.size.width/2 , self.bounds.size.height /2)]; 
     startAngle = [EntGeometry pointToRadian:[image startPoint] withCenterPoint:CGPointMake(self.bounds.size.width/2 , self.bounds.size.height /2)]; 
     imageToDraw = [image plateImg]; 
     NSLog(@"%@", image); 
     CGContextSaveGState(context); 
     CGMutablePathRef path = CGPathCreateMutable(); 
     CGPathMoveToPoint(path, NULL, self.bounds.size.width/2 , self.bounds.size.height/2); 
     CGPathAddArc(path, 
        NULL, 
        self.bounds.size.width/2, 
        self.bounds.size.height/2, 
        (self.bounds.size.width/2), 
        endAngle, 
        startAngle, 
        0); 
     CGPathCloseSubpath(path); 

     CGContextAddPath(context, path); 
     CGContextClip(context); 

     CGContextTranslateCTM(context, 0, self.bounds.size.height); 
     CGContextScaleCTM(context, 1.0, -1.0); 
     CGContextDrawImage(context, rect, [imageToDraw CGImage]); 
     CGContextRestoreGState(context); 

     //RVE MOD 
     image.imageContext = context; 

それから私は、ユーザーが、このコンテキスト内のポイントに移動しタッチを持っているかどうかを確認しようとするが、これはあなたが使用できないあなたは、コンテキストを割り当てているSwbPlateImageローカル変数を持っているように私には思える

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesMoved:touches withEvent:event]; 



    NSArray *allTouches = [touches allObjects]; 
UITouch *touch = [allTouches objectAtIndex:0]; 
SwbDragProduct*dragProd; 





for (UIView *view in self.view.subviews) { 

    if ([view isKindOfClass:[SwbPlateView class]] &(CGRectContainsPoint([view frame], [touch locationInView:self.view]))) { 
     NSLog(@" We touched in the PLATE"); 
     for (SwbPlateImage *imgView in plateView.plateImages){ 

      if(CGContextPathContainsPoint(imgView.imageContext, [touch locationInView:self.view],kCGPathFillStroke)){ 
       NSLog(@" We Touched within the IMAGE"); 
      } 
     } 
    } 
+0

は、私の答えの助けにはなりませんでしたか? – applefreak

答えて

1

動作するようには思えませんあなたがコンテキストをチェックしているときにforループにSwbPlateImageのコンテキストオブジェクトを管理および格納するSingletonクラス(たとえば、SwbPlateImageSingleTon)を持つこと。私はあなたが質問で言及したクラスについていくつかの詳細を与えることができるならば、あなたがシングルトンクラスを書くのを手助けすることができます。

あなたの質問から、CGContextRefのNSMutableArray(例えばcontextArray)をシングルトンクラスの強いオブジェクトとして持つ必要があるようです。 image.imageContextにコンテキストを割り当てるのではなく、この配列にコンテキストを追加します。

[[SwbPlateImageSingleTon sharedInstance] contextArray] addObject:context] 

次に、内部ループは以下のようになります。

for (CGContextRef context in [[SwbPlateImageSingleTon sharedInstance] contextArray]) { 
     if(CGContextPathContainsPoint(context, [touch locationInView:self.view],kCGPathFillStroke)) { 
      NSLog(@" We Touched within the IMAGE"); 
     } 
    } 

シングルトンクラス

SwbPlateImageSingleTon.h

@interface SwbPlateImageSingleTon : NSObject 
    @property (strong, nonatomic) NSMutableArray *contextArray; 
    + (SwbPlateImageSingleTon*)sharedInstance; 
@end 

SwbPlateImageSingleTon.m

私は何を探しています、私は順番にことがわかっCGContextImageにタップ検出がある
#import "SwbPlateImageSingleTon.h" 

@implementation SwbPlateImageSingleTon 
static SwbPlateImageSingleTon *sharedObject = nil; 

+ (SwbPlateImageSingleTon*)sharedInstance 
{ 
    @synchronized(self) { 
     if (!sharedObject) { 
      sharedObject = [[SwbPlateImageSingleTon alloc] init]; 
     } 
     return sharedObject; 
    } 
} 
@end 
1

私がCGContextイメージのタップを検出する必要があったのは、正しいアプローチではありませんでした。

私は座標を知っていて、uiscrollviewのタップを検出するために、私がタップしたポイントが既に描画したイメージの境界内にあるかどうかを調べるために繰り返しました。これは私にとっては完璧に機能し、座標を計算し、スクロールビューのスケールなどを更新して、座標を正しいスケールに変換することによって、画像のタップを検出することができます。

私はCGContextイメージを取得してタップを検出するのではなく、代わりに既知の位置を使って自分自身を識別することができます。

おかげ ダミアン

+0

こんにちはJonathan、タッチポイントが描画されている領域に当たったかどうかを実際に計算するオプションがわかりますが、CGContextでdrawInRectを使用して描画されたui画像でタッチを検出する方法があるかどうかは疑問です。私はすでにうまく動作するタッチポイントの計算を実装しました。私はあなたの方法は、このシナリオのために使用する人々のための良いと便利だと思うので、私はあなたに賞金を授与します:) –

1
- (BOOL)pathContainsPoint:(NSPoint)point forMode:(CGPathDrawingMode)mode 
{ 
CGPathRef path = [self quartzPath]; // Custom method to create a CGPath 
CGContextRef cgContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]; 
CGPoint cgPoint; 
BOOL containsPoint = NO; 

    cgPoint.x = point.x; 
    cgPoint.y = point.y; 

    // Save the graphics state before doing the hit detection. 
    CGContextSaveGState(cgContext); 

CGContextAddPath(cgContext, path); 
containsPoint = CGContextPathContainsPoint(cgContext, cgPoint, mode); 

    CGContextRestoreGState(cgContext); 

    return containsPoint; 
} 
+0

それは正確に彼らが探していたので、 –

関連する問題