当我慢慢画线时,绘图中的虚线不起作用

时间:2014-09-02 16:36:15

标签: ios iphone ios7 drawing

我正在ios中开发绘图功能,我有3种类型的线

  • PLANE
  • DASHED
  • DOTTED

问题在于 DOTTED lines ,当我快速绘制时它绘制得很好,但是当我慢慢绘制它时会画出实线

Bellow是代码片段,请指导我问题在哪里。

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

我的问题是simmiler喜欢这个问题,但没有找到解决方案: Drawing a dashed line with CGContextSetLineDash enter image description here

1 个答案:

答案 0 :(得分:3)

我解决了这个问题, 我用自定义逻辑更新了移动代码,

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