Изложение проблемы
Я приложение для 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();
}
}
Любая помощь в этом вопросе будет большой признательна; Я действительно в моем уме конец с этим ...
Спасибо, Алекс