iOS: рисование на CGContext в конечном итоге размывает
У меня есть приложение, которое отображает документ с UIImage поверх него, где вы можете рисовать линии и т.д., чтобы выделить вещи.
Если я продолжу рисовать линии (коснитесь, нарисуйте, уберите палец и повторите в другой области экрана)
Линии медленно размываются.
Вот мой сенсорный код, я использую kCGBlendModeCopy для blendmode, но использовал kCGBlendModeNormal. DrawingView - это UIImageView.
ОБНОВЛЕНИЕ Это линии, которые я уже нарисовал, чем они старше, тем больше они размыты, кажется, что каждая добавленная линия распадается на старые. Протестировано на iPad 2 ios8 iPad Mini Retina ios7
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
mouseSwiped = NO;
if ( self.drawingEnabled )
{
UITouch *touch = [touches anyObject];
lastPoint = [touch locationInView:self.drawingView];
UIGraphicsBeginImageContext(self.drawingView.frame.size);
[self.drawingView.image drawInRect:CGRectMake(0, 0, self.drawingView.frame.size.width, self.drawingView.frame.size.height) blendMode:kCGBlendModeCopy alpha:1.0];
}
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
if ( self.drawingEnabled )
{
mouseSwiped = YES;
UITouch *touch = [touches anyObject];
CGPoint currentPoint = [touch locationInView:self.drawingView];
CGContextRef ctxt = UIGraphicsGetCurrentContext();
CGContextMoveToPoint(ctxt, lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(ctxt, currentPoint.x, currentPoint.y);
CGContextSetLineCap(ctxt, kCGLineCapRound);
CGContextSetLineWidth(ctxt, self.brush );
CGContextSetRGBStrokeColor(ctxt, self.redColour, self.greenColour, self.blueColour, OPACITY);
if (self.eraserOn)
{
CGContextSetBlendMode(ctxt,kCGBlendModeClear);
}
else
{
CGContextSetBlendMode(ctxt,kCGBlendModeCopy);
}
CGContextStrokePath(ctxt);
self.drawingView.image = UIGraphicsGetImageFromCurrentImageContext();
lastPoint = currentPoint;
}
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesCancelled:touches withEvent:event];
UIGraphicsEndImageContext();
if(!mouseSwiped)
{
//self.drawingView.image = nil;
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
if ( self.drawingEnabled )
{
if(!mouseSwiped) {
UIGraphicsEndImageContext();
UIGraphicsBeginImageContext(self.drawingView.frame.size);
[self.drawingView.image drawInRect:CGRectMake(0, 0, self.drawingView.frame.size.width, self.drawingView.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), self.brush);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), self.redColour, self.greenColour, self.blueColour, OPACITY);
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextStrokePath(UIGraphicsGetCurrentContext());
CGContextFlush(UIGraphicsGetCurrentContext());
self.drawingView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
if (self.delegate)
{
[self.delegate drawingUpated];
}
//NSLog(@"%@ --- %@", NSStringFromCGRect(self.frame) , NSStringFromCGRect(self.drawingView.frame) );
}
}
1 ответ
Это оказалось проблемой с тем, как я настроил структуру себя. DrawingView и размер изображения внутри.
Изображение было 1005 на 720, DrawingView было 1004,2 на 719,9, поэтому возникла проблема с округлением. Каждый раз, когда я рисую новую линию, она округляется вниз.