橡皮擦在iOS绘图中不起作用

时间:2012-07-16 10:17:30

标签: ios cocoa-touch drawing core-graphics quartz-2d

我正在制作一个绘图项目,我有一个橡皮擦选项。下面给出的代码是当我启动我的应用程序并绘制一些行并继续使用橡皮擦。它工作正常,我得到了橡皮擦效果。现在第二个场景是我画了10行,然后点击“撤消按钮”并撤消整个事情,然后我重做整个事情,现在当我点击“橡皮擦按钮”并尝试擦除一些部分但相反,它将清除整个图纸。这就是我想弄清楚的,但我不知道我哪里出错了所以朋友们,请帮助我。

以下是我的代码。

- (void)drawRect:(CGRect)rect
{


      case DRAW:
    {
        [m_curImage drawAtPoint:CGPointMake(0, 0)];

        CGPoint mid1 = midPoint(m_previousPoint1, m_previousPoint2); 
        CGPoint mid2 = midPoint(m_currentPoint, m_previousPoint1);
        CGContextRef context = UIGraphicsGetCurrentContext(); 



        [self.layer renderInContext:context];
        CGContextMoveToPoint(context, mid1.x, mid1.y);
        CGContextAddQuadCurveToPoint(context, m_previousPoint1.x, m_previousPoint1.y, mid2.x, mid2.y); 
        CGContextSetLineCap(context, kCGLineCapRound);
        CGContextSetLineWidth(context, self.lineWidth);
        CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);
        CGContextSetAlpha(context, self.lineAlpha);
        CGContextSetAllowsAntialiasing(context, YES);
        CGContextStrokePath(context); 
       //            [super drawRect:rect];           
    }
         break;



        case ERASE:
        {
            [m_curImage drawAtPoint:CGPointMake(0, 0)];
            CGContextRef context = UIGraphicsGetCurrentContext();     
            CGContextClearRect(context, rect);                
            CGContextSetBlendMode(context, kCGBlendModeClear);
            [super drawRect:rect];
            break;                

  }      


        case UNDO:
        {
            [m_curImage drawInRect:self.bounds];
             break;

        }

        case REDO:
        {
            [m_curImage drawInRect:self.bounds];  
             break;           
        }


        default:
            break;
    }    
}

这些是我点击撤消/重做时运行的功能。

-(void)redrawLine
{
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0f);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    NSDictionary *lineInfo = [m_lineArray lastObject];
    m_curImage = (UIImage*)[lineInfo valueForKey:@"IMAGE"];
    UIGraphicsEndImageContext();
    [self setNeedsDisplayInRect:self.bounds];   
}


-(void)undoButtonClicked
{
    if([m_lineArray count] > 0)
    {
        NSMutableArray *line = [m_lineArray lastObject];
        [m_bufferArray addObject:line];
        [m_lineArray removeLastObject];
        [self redrawLine];
    }
    m_drawStep = UNDO;

}

-(void)redoButtonClicked
{
    if([m_bufferArray count] > 0)
    {
        NSMutableArray *line = [m_bufferArray lastObject];
        [m_lineArray addObject:line];
        [m_bufferArray removeLastObject];        
        [self redrawLine];
    }
     m_drawStep = REDO;

}

请告诉我我是否做得对。

此致

兰吉特

2 个答案:

答案 0 :(得分:5)

我已经解决了这个问题,问题及以下是完美运作的代码

case :ERASE
{
 CGPoint mid1 = midPoint(m_previousPoint1, m_previousPoint2); 
            CGPoint mid2 = midPoint(m_currentPoint, m_previousPoint1);

            [m_curImage drawAtPoint:CGPointMake(0, 0)];
            CGContextRef context = UIGraphicsGetCurrentContext(); 

            [self.layer renderInContext:context];
            CGContextMoveToPoint(context, mid1.x, mid1.y);
            CGContextAddQuadCurveToPoint(context, m_previousPoint1.x, m_previousPoint1.y, mid2.x, mid2.y); 
            CGContextSetLineCap(context, kCGLineCapRound);


            CGContextSetBlendMode(context, kCGBlendModeClear);
            CGContextSetLineJoin(context, kCGLineJoinRound);
            CGContextSetLineWidth(context, self.lineWidth);
            CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);
            CGContextSetShouldAntialias(context, YES);  
            CGContextSetAllowsAntialiasing(context, YES); 
            CGContextSetFlatness(context, 0.1f);

            CGContextSetAlpha(context, self.lineAlpha);
            CGContextStrokePath(context); 
}

此致 兰吉特。

这解决了我的问题,如果有人遇到同样的问题,请执行此操作。

答案 1 :(得分:2)

这里发生的事情就是当你擦掉整个矩形会明白na ??因此,不要使用擦除方法绘制与屏幕相同颜色的线条,以便它看起来像窗口正在清理,它很容易尝试这个。

例如 如果您的绘图屏幕是黑色的,那么在屏幕上以黑色绘制触摸线,以便它看起来像清除。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
  lastPoint = [touch locationInView:imagevw];
  }

  -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
   UITouch *touch = [touches anyObject];
   CGPoint currentPoint = [touch locationInView:imagevw];
   UIGraphicsBeginImageContext(self.imagevw.frame.size);

  [self.imagevw.image drawInRect:CGRectMake(0, 0, self.imagevw.frame.size.width,        self.imagevw.frame.size.height)];
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), width);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0); // black color
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
     imagevw.image = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();

这是在黑色视图上以黑色绘制线条的代码......只需尝试一下......它可能会帮助你......