我通常将图像绘制到屏幕外缓冲区(例如CGBitmapContext),在其上绘制贝塞尔曲线,然后将结果复制到屏幕上。
要删除其中一个贝塞尔曲线,我将图像绘制到屏幕外缓冲区,绘制所有贝塞尔曲线,除了我不想要的那条(或多条)曲线,然后将结果复制到屏幕上。
这还有一个好处,那就是它可以避免因擦除已经在屏幕上的元素而导致的闪烁。如果曲线重叠,它可以正常工作,而将图像作为图案绘制可能会消除任何重叠点。
编辑:这里有一些伪代码(从未编译 - 只是从内存中编译)来说明我的意思:
-(UIImage*)drawImageToOffscreenBuffer:(UIImage*)inputImage
{
CGBitmapContextRef offscreen = CGBitmapContextCreate(...[inputImage width], [inputImage height]...);
CGImageRef cgImage = [inputImage CGImage];
CGRect bounds = CGRectMake (0, 0, [inputImage width], [inputImage height]);
CGContextDrawImage (offscreen, bounds, cgImage);
// Now iterate through the Beziers you want to draw
for (i = 0; i < numBeziers; i++)
{
if (drawBezier(i))
{
CGContextMoveToPoint(offscreen, ...);
CGContextAddCurveToPoint(offscreen, ...); // fill in your bezier info here
}
}
// Put result into a CGImage
size_t rowBytes = CGBitmapContextGetBytesPerRow(offscreen);
CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, CGBitmapContextGetData(offscreen), rowBytes * [inputImage height], NULL);
CGColorSpaceRef colorSpace = CGBitmapContextGetColorSpace(offscreen);
CGImageRef cgResult = CGImageCreate([inputImage width], [inputImage height], ..., dataProvider, NULL, false, kCGRenderingIntentDefault);
CGDataProviderRelease(dataProvider);
CGColorSpaceRelease(rgbColorSpace);
// Make a UIImage out of that CGImage
UIImage* result = [UIImage imageWithCGImage:cgResult];
// Can't remember if you need to release the cgResult here? I think so
CGImageRelease(cgResult);
return result;
}