2012-02-23 2 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)가 있어야합니다. 나는 당신이 질문에서 언급 한 수업에 대해 더 자세한 정보를 제공 할 수 있다면 싱글 톤 수업을 작성할 수 있도록 도와 줄 수 있습니다.

귀하의 질문에, 당신은 NSMutableArray (contextArray) CGContextRef의 singleton 클래스에서 강력한 객체로해야 할 것 같습니다. 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 이미지의 꼭지점을 찾아야하는 정확한 방법이 아니 었습니다.

나는 coords를 알고 있으며 uiscrollview에서 탭을 감지하기 위해 내가 탭 한 점이 내가 이미 그렸던 이미지의 경계 상자 안에 있는지 확인하기 위해 반복했다. . 이것은 나를 위해 완벽하게 작동하고 coords를 계산하고 scrollview의 눈금 등을 업데이트하여 좌표를 정확한 눈금으로 변환하여 이미지의 탭을 감지 할 수 있습니다.

간단히 말해서 CGContext 이미지를 사용하여 탭을 감지 할 수는 없지만 대신 자신의 위치를 ​​사용하여 자신을 식별합니다.

감사 데미안

+0

안녕하세요, 조나단, 터치 포인트가 그려진 영역에 부딪혔다면 실제로 계산할 수있는 옵션을 이해 합니다만, 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

아마 정확히 그들이 찾고 있었던 것이기 때문에? –

관련 문제