I am working with multitouch while writing, So basically what I am doing is, I am writing with hand support, because typically, its how user rights, I followed this link How to ignore certain UITouch Points in multitouch sequence
Everything is working fine, but their is some problem with undo when I write with my hand touching the screen, otherwise it works fine.
Below is my code
-(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
}
}
}
Here is the image to understand my problem better, I first wrote this
After clicking on Undo once,you can see above that, some other part has been undone, instead of the last part. So I need you help in this regard.
m_redoArray appears to be the big daddy, the one you draw from. I don't understand why you empty this out out in 'touchesBegan...', surely one of these arrays must carry through touchesBegan unaltered, or you'll be dropping stuff from the start of your drawing all the way through, no?
It appears to me that this is how you dropped the 'Hell' in your example here..
Well in my case i have used bezierPath to draw on touch and have successfully implemented undo functionality. Here is the code :
Hope it will help you.