2014-09-02 14 views
6

Tôi đang phát triển tính năng vẽ trong ios, tôi có 3 loại đườngdòng chấm trong bản vẽ không hoạt động khi tôi vẽ đường chậm

  • MÁY BAY
  • tiêu tan
  • chấm

Các vấn đề là với đường DOTTED, khi tôi vẽ nhanh nó vẽ tốt, nhưng khi tôi vẽ từ từ nó vẽ đường liền nét

Dưới đây là đoạn mã, hãy hướng dẫn tôi vấn đề ở đâu.

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

Vấn đề của tôi là simmiler như câu hỏi này, nhưng không tìm thấy giải pháp trong đó: Drawing a dashed line with CGContextSetLineDashenter image description here

+0

Cách tiếp cận vẽ đường dẫn đến hình ảnh cho mỗi thay đổi sẽ không hoạt động nếu bạn muốn gạch ngang đường. Bạn sẽ phải tiếp tục thêm vào cùng một đường dẫn có thể thay đổi và vẽ lại nó. –

+0

@ DavidRönnqvist nó sẽ là tuyệt vời nếu bạn có thể giúp tôi bằng văn bản mã, tôi đã tìm kiếm rất nhiều nhưng không tìm thấy bất kỳ giải pháp –

Trả lời

3

tôi đã giải quyết được vấn đề, Tôi đã cập nhật mã của di chuyển với logic tùy chỉnh của tôi,

//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 
Các vấn đề liên quan