在iOS中擦除绘图

时间:2014-02-26 06:11:07

标签: ios uikit core-graphics cgcontext uibezierpath

我正在绘制一个绘图应用程序,我有一个UIBezeirPath,我在touchesMoved中绘制它,并将其转换为CGPath然后绘制到CGlayer,

这是我的代码

 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
              self.currentPath = [[DrawingPath alloc] init];

                if(m_eraseButtonClicked)
                {
                    [self.currentPath setPathColor:[UIColor backgroundColor]];            
                }
                else
                {
                    [self.currentPath setPathColor:self.lineColor];
                 }
             CGPathRef cgPath = self.currentPath.path.CGPath;
            mutablePath = CGPathCreateMutableCopy(cgPath);
    }


 - (void)Erase
{
    CGContextRef layerContext = CGLayerGetContext(self.DrawingLayer);              

    CGContextSetBlendMode(layerContext,kCGBlendModeClear);
    CGContextSetLineWidth(layerContext, self.eraseWidth);
    CGContextBeginPath(layerContext);
    CGContextAddPath(layerContext, mutablePath);
    CGContextStrokePath(layerContext);
}

- (void)UndoRedoFunction
{
//Undo/Redo

    for(int i =0; i<[undoArray count];i++)
    {
        DrawingPath *drawPath = [undoArray objectAtIndex:i];
        CGPathRef path = drawPath.path.CGPath;
        mutablePath = CGPathCreateMutableCopy(path);


        CGContextBeginPath(layerContext);
        CGContextAddPath(layerContext, mutablePath);
        CGContextSetLineWidth(layerContext, drawPath.pathWidth.floatValue);
        CGContextSetStrokeColorWithColor(layerContext, drawPath.pathColor.CGColor);
        CGContextSetFillColorWithColor(layerContext, drawPath.pathColor.CGColor);
        CGContextSetBlendMode(layerContext,kCGBlendModeNormal);
        CGContextStrokePath(layerContext);
        CGPathRelease(mutablePath);                  
    }
}

擦除工作正常,因为我使用blendMode Clear,但是当你看到撤消/重做时,我从路径获取pathColor并使用blenModeNormal描述它,我看到一条白线,

下面是我写完后的图像 - &gt; erase-&gt; undo-&gt; redo

enter image description here

1 个答案:

答案 0 :(得分:0)

您是否正确粘贴了代码?如图所示,-touchesMoved:withEvent方法在第14行左右关闭,就在//Erase语句之前。这意味着你的CGContextRef现在是一个类变量,你的for循环永远不会被任何人执行,我认为它不会编译,因此我想知道你是否省略了一些代码。