The dashed line when drawing does not work when I draw the line slowly

I am developing a drawing function in ios, I have 3 types of lines

  • PLANE
  • dotted
  • Dotted

The problem is DOTTED lines , when I draw quickly, it draws fine, but when I draw it slowly, it draws a solid line

Bellow is a piece of code, please tell me where the problem is.

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

My problem is simmiler, like this question, but could not find a solution in it: Drawing a dashed line using CGContextSetLineDash enter image description here

+6
source share
1 answer

I solved the problem, I updated the move code with my user logic,

 //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 
+3
source

Source: https://habr.com/ru/post/974702/


All Articles