如何检查用户是否在 CGPath 附近点击?
场景:
我有一组 CGPath。 它们大多只是线条(即不是封闭的形状)。 它们通过 UIView 的绘制方法绘制在屏幕上。
如何检查用户是否在其中一条路径附近点击?
这就是我所做的工作:
UIGraphincsBeginImageContext(CGPathGetBoundingBox(path));
CGContextRef g = UIGraphicsGetCurrentContext();
CGContextAddPath(g,path);
CGContextSetLineWidth(g,15);
CGContextReplacePathWithStrokedPath(g);
CGPath clickArea = CGContextCopyPath(g); //Not documented
UIGraphicsEndImageContext();
所以我正在做的是创建一个图像上下文,因为它具有我需要的功能。 然后,我将路径添加到上下文中,并将线宽设置为 15。此时抚摸路径将创建点击区域,我可以在其中检查以查找点击。 因此,我通过告诉上下文将路径转换为描边路径,然后将该路径复制回另一个 CGPath 来获得该描边路径。 后来,我可以检查:
if (CGPathContainsPoint(clickArea,NULL,point,NO)) { ...
一切都运行得很好,但是 CGContextCopyPath 没有记录,由于显而易见的原因,使用它似乎是一个坏主意。 仅出于此目的创建 CGContext 也有一定的笨拙之处。
那么,有人有什么想法吗? 如何检查用户是否在 CGPath
上的任何区域附近(在本例中为 15 像素内)点击?
Scenario:
I have a set of CGPath
s. They are mostly just lines (i.e. not closed shapes). They are drawn on the screen in a UIView
's draw method.
How can I check if the user tapped near one of the paths?
Here's what I had working:
UIGraphincsBeginImageContext(CGPathGetBoundingBox(path));
CGContextRef g = UIGraphicsGetCurrentContext();
CGContextAddPath(g,path);
CGContextSetLineWidth(g,15);
CGContextReplacePathWithStrokedPath(g);
CGPath clickArea = CGContextCopyPath(g); //Not documented
UIGraphicsEndImageContext();
So what I'm doing is creating an image context, because it has the functions I need. I then add the path to the context, and set the line width to 15. Stroking the path at this point would create the click area I can check inside of to find clicks. So I get that stroked path by telling the context to turn the path into a stroked path, then copying that path back out into another CGPath. Later, I can check:
if (CGPathContainsPoint(clickArea,NULL,point,NO)) { ...
It all worked well and good, but the CGContextCopyPath
, being undocumented, seemed like a bad idea to use for obvious reasons. There's also a certain kludginess about making a CGContext
just for this purpose.
So, does anybody have any ideas? How do I check if a user tapped near (in this case, within 15 pixels) of any area on a CGPath
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在 iOS 5.0 及更高版本中,可以使用 CGPathCreateCopyByStrokingPath 更简单地完成此操作:
In iOS 5.0 and later, this can be done more simply using
CGPathCreateCopyByStrokingPath
:嗯,我找到了答案。 它使用 CGPathApply:
基本上这只是我自己的 ReplacePathWithStrokedPath 方法,但它目前仅适用于线条。
Well, I figured out an answer. It uses CGPathApply:
Basically it's just my own method for ReplacePathWithStrokedPath, but it only works with lines for right now.
在斯威夫特
In Swift