Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dotted line in drawing not works when I draw line slowly

I am developing drawing feature in ios, I have 3 type of lines

  • PLANE
  • DASHED
  • DOTTED

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

Bellow is the code snippet, please guide me where is the 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();
    }
}

My problem is simmiler like this question, but didn't found solution in it: Drawing a dashed line with CGContextSetLineDashenter image description here

like image 789
Abdul Rauf Avatar asked Sep 02 '14 16:09

Abdul Rauf


1 Answers

I solved the problem, I have updated the code of move with my custom 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
like image 105
abdulrauf618 Avatar answered Sep 24 '22 04:09

abdulrauf618