Пунктирная линия в рисовании не работает, когда я рисую линию медленно


Я разрабатываю функцию рисования в ios, у меня есть 3 типа линий

  • плоскость
  • пунктир
  • пунктир

Проблема с пунктирными линиями , Когда я рисую быстро, он рисует хорошо, но когда я рисую медленно, он рисует сплошную линию

Ниже приведен фрагмент кода, пожалуйста, укажите мне, где проблема.

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

Моя проблема-симмилер, как этот вопрос, но не нашел в нем решения.: рисуя пунктирную линию с CGContextSetLineDashВведите описание изображения здесь

1   6   2014-09-02 20:36:14

1 ответ:

Я решил эту проблему., Я обновил код перемещения с помощью своей пользовательской логики,

//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