2014-09-02 18 views
6

Zajmuję funkcji rysowania w iOS, mam 3 Typ liniiPrzerywana linia na rysunku nie działa, gdy rysuję linię powoli

  • PLANE
  • przerywana
  • kropkowana

The problem z DOTTED linie, kiedy rysuję szybko rysuje dobrze, ale kiedy rysuje to powoli rysuje ciągłą linię

Osłona jest fragmentem kodu, proszę wskazać mi, gdzie jest problem.

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

Mój problem jest simmiler jak to pytanie, ale nie znaleziono rozwiązanie w nim: Drawing a dashed line with CGContextSetLineDashenter image description here

+0

Podejście polegające na narysowaniu ścieżki do obrazu dla każdej zmiany nie będzie działało, jeśli chcesz przerwać linię. Będziesz musiał dodawać do tej samej ścieżki i przerysować ją. –

+0

@ DavidRönnqvist byłoby miło, gdybyś pomógł mi napisać kod, dużo szukałem, ale nie znalazłem żadnego rozwiązania –

Odpowiedz

3

I rozwiązać problem, Mam zaktualizowany kod przenieść z mojego niestandardowego logiki

//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 
Powiązane problemy