在iOS中使用多点触控绘图进行撤消

我正在使用多点触控书写,所以基本上我正在做的是,我手写支持,因为通常,它的用户权限,我跟着这个链接如何忽略多点触控顺序中的某些UITouch点

一切工作正常,但是当我用手触摸屏幕的时候,他们是撤销的一些问题,否则它工作正常。

以下是我的代码

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch* topmostTouch = self.trackingTouch; for (UITouch *touch in touches) { ctr = 0; touchStartPoint1 = [touch locationInView:self]; [m_undoArray removeAllObjects]; [m_redoArray removeAllObjects]; [m_parentRedoArray removeAllObjects]; if(!topmostTouch || [topmostTouch locationInView:self].y > touchStartPoint1.y) { topmostTouch = touch; pts[0] = touchStartPoint1; } } if (self.trackingTouch != nil && self.trackingTouch != topmostTouch) // ![touches containsObject:self.trackingTouch]) { [self discardDrawing]; } self.trackingTouch = topmostTouch; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { if(self.trackingTouch== nil) { return; } CGPoint p = [self.trackingTouch locationInView:self]; ctr++; pts[ctr] = p; if (ctr == 4) { pts[3] = midPoint(pts[2], pts[4]); self.currentPath = [[DrawingPath alloc] init]; [self.currentPath setPathColor:self.lineColor]; self.currentPath.pathWidth = [NSString stringWithFormat:@"%f",self.lineWidth]; [self.currentPath.path moveToPoint:pts[0]]; [self.currentPath.path addCurveToPoint:pts[3] controlPoint1:pts[1] controlPoint2:pts[2]]; CGPathRef cgPath = self.currentPath.path.CGPath; mutablePath = CGPathCreateMutableCopy(cgPath); [m_undoArray addObject:self.currentPath]; [self setNeedsDisplay]; pts[0] = pts[3]; pts[1] = pts[4]; ctr = 1; } } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { for (UITouch *touch in touches) { if(touch == self.trackingTouch) { [m_parentUndoArray addObject:[NSArray arrayWithArray:m_undoArray]]; } } } -(void)undoButtonClicked { NSMutableArray *undoArray = [m_parentUndoArray lastObject]; NSLog(@"%@",undoArray); [m_parentUndoArray removeLastObject]; [m_parentRedoArray addObject:undoArray]; m_drawStep = UNDO; [self setNeedsDisplay]; } - (void)drawRect { I have different cases here, I am showing Of Undo for(int i = 0; i<[m_parentUndoArray count];i++) { NSMutableArray *undoArray = [m_parentUndoArray objectAtIndex:i]; NSLog(@"%@",undoArray); for(int i =0; i<[undoArray count];i++) { DrawingPath *drawPath = [undoArray objectAtIndex:i]; GPathRef path = drawPath.path.CGPath; mutablePath = CGPathCreateMutableCopy(path); //Draw into CgLayer } } } 

这里是更好地理解我的问题的形象,我首先写这个

在这里输入图像说明

点击撤销一次后

点击撤消一次后,您可以看到上面的一些其他部分已经撤消,而不是最后一部分。 所以我需要你们在这方面的帮助。

m_redoArray似乎是大爸爸,你从中吸取的。 我不明白你为什么在'touchesBegan'中清空这个,肯定这些数组中的一个必须通过touchesBegan保持不变,否则你会从你的绘图开始一直拖下去,不是吗?

在我看来,这就是你在这个例子中放弃了“地狱”的原因。

那么在我的情况下,我用bezierPath来触摸,并已成功实现撤消function。 这里是代码:

 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code self.backgroundColor = [UIColor clearColor]; myPath = [[UIBezierPath alloc] init]; myPath.lineCapStyle = kCGLineCapRound; myPath.miterLimit = 0; bSize=5; myPath.lineWidth = bSize; brushPattern = [UIColor whiteColor]; // Arrays for saving undo-redo steps in arrays pathArray = [[NSMutableArray alloc] init]; bufferArray = [[NSMutableArray alloc] init]; } return self; } // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { [brushPattern setStroke]; for (id path in pathArray){ if ([path isKindOfClass:[UIBezierPath class]]) { UIBezierPath *_path=(UIBezierPath *)path; [_path strokeWithBlendMode:kCGBlendModeNormal alpha:1.0]; } } } #pragma mark - Touch Methods -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *mytouch = [[touches allObjects] objectAtIndex:0]; myPath = [[UIBezierPath alloc] init]; myPath.lineWidth = bSize; [myPath moveToPoint:[mytouch locationInView:self]]; [pathArray addObject:myPath]; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [myPath addLineToPoint:[[touches anyObject] locationInView:self]]; [self setNeedsDisplay]; } #pragma mark - Undo Method -(void)undoButtonClicked { if([pathArray count]>0) { UIBezierPath *_path = [pathArray lastObject]; [bufferArray addObject:_path]; [pathArray removeLastObject]; [self setNeedsDisplay]; } } -(void)setBrushSize: (CGFloat)brushSize { bSize=brushSize; } -(void)redoButtonClicked { if([bufferArray count]>0){ UIBezierPath *_path = [bufferArray lastObject]; [pathArray addObject:_path]; [bufferArray removeLastObject]; [self setNeedsDisplay]; } } 

希望它会帮助你。