Рисование iOS с отставанием / сбоем CGContextStrokePath () при рисовании при увеличении

Изложение проблемы

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

У меня на симуляторе работает хорошо, а вот на айпаде совсем лагает (а иногда и вылетает). Проблема становится гораздо более очевидной, когда вы пытаетесь высушить при уже увеличенном масштабе в 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();
    }
} 

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

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


person AlexFZ    schedule 27.07.2011    source источник


Ответы (2)


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

Взгляните на следующий код Apple:

GLPaint

person rjm619    schedule 15.11.2011

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

person Ranjit    schedule 19.06.2012