2013-11-23 2 views
0

Ну, я использую Quartz2D для рисования вещей, я следил за этим tutorial и его работоспособным. Но мне нужно реализовать опцию UNDO.Я использовал Quartz2D для рисования линии, Теперь для UNDO нарисованной линии?

У меня есть кнопка отмены, когда я нажимаю ее, она должна отменить нарисованную линию.

I "M используя ниже код, чтобы рисовать. Знает ли какой-либо один раствор для него.

Thaks в Advance.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

mouseSwiped = NO; 
UITouch *touch = [touches anyObject]; 
lastPoint = [touch locationInView:self.view]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

mouseSwiped = YES; 
UITouch *touch = [touches anyObject]; 
CGPoint currentPoint = [touch locationInView:self.view]; 

UIGraphicsBeginImageContext(self.view.frame.size); 
[self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush); 
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0); 
CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeNormal); 

CGContextStrokePath(UIGraphicsGetCurrentContext()); 
self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
[self.tempDrawImage setAlpha:opacity]; 
UIGraphicsEndImageContext(); 

lastPoint = currentPoint; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

if(!mouseSwiped) { 
    UIGraphicsBeginImageContext(self.view.frame.size); 
    [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush); 
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, opacity); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    CGContextFlush(UIGraphicsGetCurrentContext()); 
    self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
} 

UIGraphicsBeginImageContext(self.mainImage.frame.size); 
[self.mainImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) blendMode:kCGBlendModeNormal alpha:1.0]; 
[self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) blendMode:kCGBlendModeNormal alpha:opacity]; 
self.mainImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
self.tempDrawImage.image = nil; 
UIGraphicsEndImageContext(); 
} 

ответ

0

вы не можете отменить определенную операцию рисования. Вы должны сохранить все касания и сохранить его соответствующим образом (ваш объект «шаг»). Вы сохраняете эти «шаговые» объекты в рисовальном сеансе (массиве), и если вы хотите сделать отмену, вы удалите последний объект в этом массиве и после этого перерисовать все изображение со всеми шагами, оставшимися в массиве (сеансе).

0

Самый простой способ сделать отмену - захватить прямоугольник, который вот-вот изменит и сохранит содержимое этого прямоугольника в памяти или в файле. Когда вы хотите отменить, просто нарисуйте прямоугольник, который был сохранен в правильных координатах, с помощью kCGBlendModeCopy.

Для многократной отмены вы можете сохранить стек этих прямоугольников и поп, если они хотят отменить. Redo также легко, а не поп, вы просто перемещаете одну позицию в массиве. Для повтора вы двигаетесь вперед на одну позицию.

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

Удачи вам!