I am working with multitouch while writing. Therefore, basically I do this, I write with hand support, because, as a rule, its user rights, I followed this link How to ignore certain UITouch points in a multitouch sequence
So what I do, I track the Touch Object in touchhesBegan and use it only in touchhesMoved.Everything works fine, but several times when I write, I get this line

In the above image you can see a thick line that suddenly appears when recording with a hand touching the screen
Here is the code
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"Touches began"); UITouch* topmostTouch = self.trackingTouch; for (UITouch *touch in touches) { bufIdx = 0; isFirstTouchPoint = YES; ctr = 0; pts[0] = [touch locationInView:self]; if(!topmostTouch || [topmostTouch locationInView:self].y > pts[0].y) { topmostTouch = touch; //touchStartPoint1 = pts[0]; } else { pts[0] = pts[3]; } } if (self.trackingTouch != nil && self.trackingTouch != topmostTouch) { [self discardDrawing]; } self.trackingTouch = topmostTouch; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { // Find the touch that we track for drawing CGPoint p = [self.trackingTouch locationInView:self]; ctr++; pts[ctr] = p; if (ctr == 4) { pts[3] = midPoint(pts[2], pts[4]); for ( int i = 0; i < 4; i++) { pointsBuffer[bufIdx + i] = pts[i]; } bufIdx += 4; dispatch_async(drawingQueue, ^{ //UIBezierPath *offsetPath = [UIBezierPath bezierPath]; // ................. (2) self.currentPath = [[DrawingPath alloc] init]; [self.currentPath setPathColor:self.lineColor]; if (bufIdx == 0) return; LineSegment ls[4]; for ( int i = 0; i < bufIdx; i += 4) { if (isFirstTouchPoint) // ................. (3) { ls[0] = (LineSegment){pointsBuffer[0], pointsBuffer[0]}; [self.currentPath.path moveToPoint:ls[0].firstPoint]; isFirstTouchPoint = NO; } else { ls[0] = lastSegmentOfPrev; } float frac1 = self.lineWidth/clamp(len_sq(pointsBuffer[i], pointsBuffer[i+1]), LOWER, UPPER); // ................. (4) float frac2 = self.lineWidth/clamp(len_sq(pointsBuffer[i+1], pointsBuffer[i+2]), LOWER, UPPER); float frac3 = self.lineWidth/clamp(len_sq(pointsBuffer[i+2], pointsBuffer[i+3]), LOWER, UPPER); ls[1] = [self lineSegmentPerpendicularTo:(LineSegment){pointsBuffer[i], pointsBuffer[i+1]} ofRelativeLength:frac1]; // ................. (5) ls[2] = [self lineSegmentPerpendicularTo:(LineSegment){pointsBuffer[i+1], pointsBuffer[i+2]} ofRelativeLength:frac2]; ls[3] = [self lineSegmentPerpendicularTo:(LineSegment){pointsBuffer[i+2], pointsBuffer[i+3]} ofRelativeLength:frac3]; [self.currentPath.path moveToPoint:ls[0].firstPoint]; // ................. (6) [self.currentPath.path addCurveToPoint:ls[3].firstPoint controlPoint1:ls[1].firstPoint controlPoint2:ls[2].firstPoint]; [self.currentPath.path addLineToPoint:ls[3].secondPoint]; [self.currentPath.path addCurveToPoint:ls[0].secondPoint controlPoint1:ls[2].secondPoint controlPoint2:ls[1].secondPoint]; [self.currentPath.path closePath]; lastSegmentOfPrev = ls[3]; // ................. (7) } dispatch_async(dispatch_get_main_queue(), ^{ bufIdx = 0; [m_pathArray addObject:self.currentPath]; [self setNeedsDisplay]; }); }); pts[0] = pts[3]; pts[1] = pts[4]; ctr = 1; } } }
So friends, please help me.
ios uikit core-graphics uibezierpath multi-touch
Ranjit Feb 04 '14 at 6:59 2014-02-04 06:59
source share