使用 UIBezierPath 擦除线条图
Posted
技术标签:
【中文标题】使用 UIBezierPath 擦除线条图【英文标题】:Erase line drawing with UIBezierPath 【发布时间】:2011-05-30 14:24:46 【问题描述】:用 UIBezierPath 做了一个简单的画线应用程序,但现在需要一种方法来擦除用 UIBezierPath 绘制的线。有没有办法实现删除线画的橡皮擦功能?
【问题讨论】:
【参考方案1】:如果您使用图像作为背景,那么您可以将相同的图像设置为画笔图案来绘制贝塞尔路径,它实际上会给您带来橡皮擦效果。这个对我有用。 :)
brushPattern=[[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"image.jpg"]];
// Here image.jpg is you background image
【讨论】:
请您解释一下。我没找到你 @FaheemRahman。说例子: 1.你有一个画线的视图,它有一个背景图像。 2. U 正在绘制不同颜色的贝塞尔路径线(每条路径都有颜色和画笔图案) 3. 对于橡皮擦,使用另一个贝塞尔路径并将其画笔图案设置为您用于背景的相同图像。它实际上看起来像橡皮擦。【参考方案2】:if(erase)
[myPath strokeWithBlendMode:kCGBlendModeClear alpha:1.0f];
else
[myPath strokeWithBlendMode:kCGBlendModeNormal alpha:1.0f];
【讨论】:
【参考方案3】:橡皮擦有效地绘制了一条与迄今为止绘制的每条路径顶部的背景颜色相同的线条。您可能需要注意它是某处的橡皮擦线,以便在背景颜色发生变化时更新橡皮擦线的笔触颜色,否则您会失去擦除的错觉。
【讨论】:
感谢您的回复。如果我的背景是纹理图像怎么办?有没有办法抹掉这条线? 我边走边编。有人可能已经解决了这个问题,而且更好。但是您可以根据需要执行路径拆分来执行擦除。基本思想是,在画线上画一条橡皮擦线应该将该线分成两条线,在橡皮擦所在的地方留下一个间隙。两条线在绘制顺序中的位置应与原始单线相同。 @Jeremy,我的背景有纹理,我不知道如何画一条与后面的纹理图案相匹配的线条。这有什么参考吗?谢谢 @TonyMocha 处理带纹理的背景的想法是通过将路径中落在擦除之下的部分从路径中切掉,留下两条路径来实际执行擦除。以图解方式,假设您有一条黑线---
。现在假设用户擦除了中间像素。你现在有两条黑线- -
,它们之间有一个间隙。背景会自然地穿过那个间隙。
@Jeremy,感谢您花时间回复。我明白了你的想法,但是我可以使用什么库或函数来删除该行,quartz2d?我做了一些搜索,但找不到切割交叉点的方法(对不起,我是 iPhone 开发的新手。请耐心等待。哈哈)【参考方案4】:
根据 Jeremy 的回答,根据您的 cmets,您似乎正在尝试制作虚线。你试过用setLineDash:count:phase:
UIBezierPath *path = [UIBezierPath new];
CGFloat dashArray[3];
dashArray[0] = 8;
dashArray[1] = 3;
dashArray[2] = 8;
[path setLineDash:dashArray count:dashCount phase: 0.0];
Apple 在此处提供示例代码:http://developer.apple.com/library/mac/#samplecode/BezierPathLab/Introduction/Intro.html
【讨论】:
以上是关于使用 UIBezierPath 擦除线条图的主要内容,如果未能解决你的问题,请参考以下文章