Получите прикосновения в UIImage, нарисованном с CGContext - PullRequest
1 голос
/ 23 февраля 2012

Я пытаюсь определить, нажимает ли пользователь на изображении при рисовании с помощью CGContext и пути, как показано ниже (это происходит в классе настраиваемого представления под названием SwbPlate:

  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;

Затем я пытаюсь увидеть, перемещались ли касания пользователя на точку в этом контексте, но это, похоже, не работает

- (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");
            }
        }
    }

Ответы [ 3 ]

1 голос
/ 02 ноября 2012

Я ищу обнаружение касаний на CGContextImage. Я обнаружил, что для того, чтобы сделать то, что мне нужно, обнаружение касаний на изображении CGContext было неправильным подходом.

У меня есть список точек в памяти, по которым я знаю координаты, и для обнаружения касаний в просмотре uiscroll я итерировал их, чтобы увидеть, находится ли точка, которую я коснулся, внутри ограничительной рамки изображения, которое я уже нарисовал. Это отлично работает для меня, и я могу обнаруживать касания на изображении, вычисляя координаты, обновляя масштаб и т. Д. Вида прокрутки, чтобы также преобразовать координаты в правильный масштаб.

Итак, короче говоря, я пришел к ответу, что невозможно получить изображение CGContext для обнаружения касания, но вместо этого использовать их известные позиции, чтобы идентифицировать попадание самостоятельно.

Спасибо Дэмиен

1 голос
/ 08 ноября 2012
- (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;
}
1 голос
/ 01 ноября 2012

Мне кажется, что у вас есть локальная переменная SwbPlateImage, в которой вы назначаете контекст, который недоступен в цикле for при проверке контекста.Вам потребуется класс Singleton (скажем, SwbPlateImageSingleTon), который управляет и хранит объекты контекста SwbPlateImage.Я могу помочь вам написать одноэлементный класс, если вы можете дать более подробную информацию о классах, которые вы упомянули в вопросе.

Исходя из вашего вопроса, похоже, вам понадобится 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");
        }
    }

Класс Singleton

SwbPlateImageSingleTon.h

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

SwbPlateImageSingleTon.m

#import "SwbPlateImageSingleTon.h"

@implementation SwbPlateImageSingleTon
static SwbPlateImageSingleTon *sharedObject = nil;

+ (SwbPlateImageSingleTon*)sharedInstance
{
    @synchronized(self) {
        if (!sharedObject) {
            sharedObject = [[SwbPlateImageSingleTon alloc] init];
        }
        return sharedObject;
    }
}
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...