2014-02-04 1 views
3

Я работаю с мультитач при написании, поэтому в основном то, что я делаю, я пишу с поддержкой руки, потому что, как правило, его как пользовательские права, я следовал этой ссылке How to ignore certain UITouch Points in multitouch sequenceMultitouch отслеживания ошибок

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

enter image description here

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

Вот код

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

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

+0

подход упоминается в этой должности может работать для вас [Stackoverflow ссылка] [1] [1]: http://stackoverflow.com/questions/20853765/how-to-ignore-certain-uitouch -points-in-multitouch-sequence –

+0

@bhavyakothari, я думаю, что вы не прочитали мой вопрос должным образом, я пошел по той же ссылке, а также я упомянул об этом в своем вопросе – Ranjit

ответ

4

Вам нужно будет отладить, чтобы подтвердить, но, похоже, он связан с вашей логикой в ​​touchesBegan:withEvent:. В этом методе вы проверяете каждый раз, когда появляется новое касание, чтобы определить, является ли оно «самым высоким», но когда самое высокое касание действительно изменяется, вы, кажется, не прервали/не сбросили любой существующий чертеж.

Ваш лучший подход, вероятно, используется для ведения журнала, чтобы определить, изменяется ли/когда изменяется «самое высокое», и что влияет на то, что имеет место на линии прогресса.

Также, в touchesMoved:, вам не нужен цикл for (UITouch *touch in touches), так как у вас уже есть ссылка на self.trackingTouch, поэтому вы можете просто использовать его напрямую.

+0

Здравствуйте, @Wain, спасибо за ваш ответ, я сделал редактирует код в соответствии с вашим предложением, я имел в виду, что я показываю код, как я прерываю любой существующий чертеж. Одна вещь, которую я заметил, в то время как тестирование заключается в том, что это происходит только тогда, когда вы пишете, если ваши два или более пальцев рук касаются экрана ниже, если касаться только один палец, кроме пальца чертежа, тогда он пишет правильно. – Ranjit

+0

От взгляда на код I * guess * путем уничтожения 'self.currentPath' и сброса' ctr' в ноль, чтобы перезапустить алгоритм рисования линии. – Wain

+0

Когда я должен это сделать? В touchsBegan, когда я получаю более высокое значение касания? Но я всегда создаю новый self.currentPath или очень трогательный. Что сказать? @Wain – Ranjit

1

Если я правильно понял вашу проблему, у вас возникают нежелательные штрихи, когда пользователь использует несколько пальцев на вашем холсте. Поскольку у вас уже есть self.trackingTouch, будет ли разумно просто игнорировать все остальные нажатия, которые не являются self.trackingTouch?

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if (self.trackingTouch) 
    { 
     // another touch is active so we ignore this one 
     return; 
    } 
    // ...the rest of your code 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = self.trackingTouch; 
    if (![touches containsObject:touch]) 
    { 
     // updates to touches other than self.trackingTouch 
     return; 
    } 

    // ...process only self.trackingTouch in the rest of your code 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = self.trackingTouch; 
    if (![touches containsObject:touch]) 
    { 
     // updates to touches other than self.trackingTouch 
     return; 
    } 

    // ...process only self.trackingTouch in the rest of your code 

    self.trackingTouch = nil; 
} 

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    // ...same as touchesEnded:withEvent: 
} 
+0

Эй, спасибо за ваш ответ, я игнорирую все остальные касания, потому что в касанияхБеган, я проверяю состояние и основы на этом я решаю отслеживание касания. Так что в этом плохого? – Ranjit

+0

@ Ranjit Вы внесли обновления в свой код, так как вы разместили этот вопрос? Возможно, было бы полезно обновить исходный пост. – Manny

+0

@ Джона, я не внес серьезных изменений, которые изменили бы мой первоначальный пост. – Ranjit