2014-09-02 7 views
6

ich die Entwicklung bin Zeichnung Feature in ios, ich habe 3 Arten von LinienDie gestrichelte Linie in der Zeichnung nicht funktioniert, wenn ich Linie ziehen langsam

  • FLUGZEUG
  • DASHED
  • DOTTED

Die Problem ist mit PUNKTE Linien, wenn ich schnell zeichne zieht es gut, aber wenn ich es langsam zeichne zieht es feste Linie

Bellow ist das Code-Snippet, bitte führen Sie mich, wo das Problem ist.

- (void)drawingLayerMoved:(UIPanGestureRecognizer *)recognizer { 

    //MOVE START 
    if (recognizer.state == UIGestureRecognizerStateBegan) { 
     dw_mouseSwiped = NO; 
     dw_lastPoint = [recognizer locationInView:self.tempDrawImage]; 

     UIGraphicsBeginImageContext(self.tempDrawImage.frame.size); 
     [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.tempDrawImage.frame.size.width, self.tempDrawImage.frame.size.height)]; 

    } 
    //MOVING 
    else if (recognizer.state == UIGestureRecognizerStateChanged) { 

     dw_mouseSwiped = YES; 
     CGPoint currentPoint = [recognizer locationInView:self.tempDrawImage]; 
     CGContextRef dw_context = UIGraphicsGetCurrentContext(); 

     if([dw_brushType isEqual: DRAWING_DOTTED_LINE]) { 
      CGContextSetLineCap(dw_context, kCGLineCapRound); 
     } 
     else if([dw_brushType isEqual: DRAWING_DASHED_LINE]) { 
      CGContextSetLineCap(dw_context, kCGLineCapSquare); 
     } 
     else if([dw_brushType isEqual: DRAWING_PLANE_LINE] ) { 
      CGContextSetLineCap(dw_context, kCGLineCapRound); 
     } 

     // ADD FEW SPACES B/W DOTS OF LINE 
     if([dw_brushType isEqual: DRAWING_DASHED_LINE] || [dw_brushType isEqual: DRAWING_DOTTED_LINE]) { 
      CGFloat dw_dash[] = {2,dw_brush*3,dw_brush*2,dw_brush}; 
      CGContextSetLineDash(dw_context, 1, dw_dash, 4); 
     } 

     //BRUSH WIDTH (we have devided it on 3) 
     CGContextSetLineWidth(dw_context, (dw_brush/3)); 

     if([dw_drawingLayerMode isEqualToString:DRAWING_LAYER_MODE_ERASER]){ 
      //BRUSH CLEAR COLOR 
      CGContextSetFillColorWithColor(dw_context, [UIColor clearColor].CGColor); 
      //CLEAR DRAWING 
      CGContextSetBlendMode(dw_context, kCGBlendModeClear); 
     } else{ 
      // BRUSH RGB COLOR 
      CGContextSetRGBStrokeColor(dw_context, dw_red, dw_green, dw_blue, dw_opacity); 
      //NORMAL DRAWING 
      CGContextSetBlendMode(dw_context,kCGBlendModeNormal); 
     } 

     CGContextMoveToPoint(dw_context, dw_lastPoint.x, dw_lastPoint.y); 
     CGContextAddLineToPoint(dw_context, currentPoint.x, currentPoint.y); 
     CGContextStrokePath(dw_context); 

     //SAVE CURRENT MOVE INFO IN TEMP IMG 
     self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 

     //SAVE CURRENT MOVE POINT AS dw_lastPoint 
     dw_lastPoint = currentPoint; 

    } 
    //MOVE END 
    else if (recognizer.state == UIGestureRecognizerStateEnded) { 
     UIGraphicsEndImageContext(); 
    } 
} 

Mein Problem ist simmiler wie diese Frage, aber er fand keine Lösung darin: Drawing a dashed line with CGContextSetLineDashenter image description here

+0

Der Ansatz, den Pfad zu einem Bild für jede Änderung zu zeichnen, funktioniert nicht, wenn Sie die Linie streichen möchten. Sie müssen den gleichen veränderbaren Pfad hinzufügen und neu zeichnen. –

+0

@ DavidRönnqvist es wäre toll, wenn Sie mir beim Schreiben des Codes helfen können, ich habe viel gesucht, aber keine Lösung gefunden –

Antwort

3

ich das Problem gelöst, Ich habe den Code bewegen sich mit meiner benutzerdefinierten Logik aktualisiert,

//MOVING 
    else if (recognizer.state == UIGestureRecognizerStateChanged) { 

     dw_mouseSwiped = YES; 
     CGPoint currentPoint = [recognizer locationInView:self.tempDrawImage]; 
     BOOL dw_addThisPointInLine = YES; 


     if(([dw_brushType isEqual: DRAWING_DASHED_LINE] || [dw_brushType isEqual: DRAWING_DOTTED_LINE]) && !([dw_drawingLayerMode isEqualToString:DRAWING_LAYER_MODE_ERASER])) { 

      CGFloat dw_points_distance = 0.0; 
      dw_points_distance = [self distanceBtwPoints:currentPoint p2:dw_lastPoint]; 

      if(dw_points_distance < dw_brush) 
      dw_addThisPointInLine = NO; 

      if(!(dw_addThisPointInLine)) { 
       if(dw_points_distance > 30 && dw_brush < 50) 
       dw_addThisPointInLine = YES; 
       else if(dw_points_distance > 40 && dw_brush < 80) 
       dw_addThisPointInLine = YES; 
       else if(dw_points_distance > 50 && dw_brush < 100) 
       dw_addThisPointInLine = YES; 
      } 
     } 

     if(dw_addThisPointInLine) { 
      //shif the code of move inside this condition. 
     } 


}//move code end