Мультитач отслеживания проблемы

Я работаю с мультитач во время написания, так что, в основном, я пишу с ручной поддержкой, потому что, как правило, это как права пользователя, я следовал по этой ссылкеКак игнорировать определенные точки UITouch в мультитач-последовательности

Итак, что я делаю, так это отслеживаю сенсорный объект в touchesBegan и использую его только в touchesMoved. Все работает нормально, но иногда при записи я получаю эту строку

На изображении выше вы можете видеть толстую линию, которая внезапно появляется, когда я пишу рукой на экране

Вот код

-(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;
            }
        }        
}

Итак, друзья, пожалуйста, помогите мне.

Ответы на вопрос(2)

Ваш ответ на вопрос