iOS-рисование с помощью CGContextStrokePath () с задержкой / сбоем при рисовании при увеличении - PullRequest
2 голосов
/ 27 июля 2011

Краткое описание проблемы

Я приложение для iPad с UIImageView внутри UIScrollView.Я хочу, чтобы пользователь мог рисовать поверх UIImageView с помощью стилуса и / или своего пальца.

У меня он хорошо работает на симуляторе, но он полностью зависает (и иногда вылетает)на iPad.Проблема становится намного более очевидной, когда вы пытаетесь высушить , когда уже увеличено в UIScrollView;он становится невероятно запаздывающим (по существу зависает), а затем падает.

(прокрутка в UIScrollView не конфликтует с рисованием, так как для него требуется 2 пальца, когда рисование активно.)

Код

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

 /**
 When the user first starts writing
 */
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    isMouseMoved = NO;
    UITouch *touch = [touches anyObject]; 

    CGPoint currentPoint = [touch locationInView:imageView];

    if(isEraserOn){
        [self changeEraserLocationTo:currentPoint];
    } 

    [self resetEraser:FALSE];
    lastPoint = [touch locationInView:imageView];
} 

/**
 When the user first starts moving the pen
 */
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    isMouseMoved = YES; 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentPoint = [touch locationInView:imageView]; 

    // Setting up the context
    UIGraphicsBeginImageContext(imageView.frame.size);
    [imageView.image drawInRect:CGRectMake(0, 0, imageView.frame.size.width, imageView.frame.size.height)];

    if (isEraserOn) {
        CGContextSetLineWidth(UIGraphicsGetCurrentContext(), eraserRadius);
        CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
        CGRect eraserFrame = eraser.frame; 
        eraserFrame.origin.x = currentPoint.x - (eraserRadius/2);
        eraserFrame.origin.y = currentPoint.y - (eraserRadius/2);
        eraser.frame = eraserFrame;
    } else {
        CGContextSetLineWidth(UIGraphicsGetCurrentContext(), penRadius);
        CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), r, g, b, 1.0); 
        CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeNormal);
    }

    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());

    imageView.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    lastPoint = currentPoint; 
    mouseMoved++; 

    if (mouseMoved == 1) {
        mouseMoved = 0;
    } 
} 

/**
 When the user stops writing
 */
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self resetEraser:TRUE]; 

    if (!isMouseMoved) {
        UIGraphicsBeginImageContext(imageView.frame.size);
        CGContextRef contextRef = UIGraphicsGetCurrentContext(); 

        [imageView.image drawInRect:CGRectMake(0, 0, imageView.frame.size.width, imageView.frame.size.height)];

        CGContextSetLineWidth(contextRef, penRadius);
        CGContextSetRGBStrokeColor(contextRef, r, g, b, 1.0);
        CGContextMoveToPoint(contextRef, lastPoint.x, lastPoint.y);
        CGContextAddLineToPoint(contextRef, lastPoint.x, lastPoint.y);
        CGContextStrokePath(contextRef);
        imageView.image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
} 

Любая помощь в этом вопросе будет очень оценена;Я действительно в своем уме с этим ...

Спасибо, Алекс

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Я недавно разработал приложение, которое позволяет рисовать на изображениях.Я реализовал его так, чтобы создать еще один слой UIView, а затем сделать рисунок / графику на этом виде.Затем вы можете переместить все свои сенсорные события в представление gl.У меня не было проблем с производительностью моей текущей реализации, и ее не следует изменять при увеличении. Также проверьте свою память, возможно, у нее утечка.

Посмотрите на следующий код Apple:

GLPaint

0 голосов
/ 19 июня 2012

как вы сказали, что используете стилус или палец, так что, когда вы используете стилус / палец, как вы обрабатываете сенсорные события, я хочу сказать, что, когда пользователь, держащий стилус в руке, положит руку на Экран ipad, а затем попробуйте написать (как мы пишем на бумаге), так ли ваш стилус работает в этом сценарии.

...