场景:
我有一套CGPaths.它们大多只是线条(即不是封闭的形状).它们以绘图方式绘制在屏幕上UIView.
如何检查用户是否在其中一条路径附近轻敲?
这就是我的工作:
UIGraphincsBeginImageContext(CGPathGetBoundingBox(path));
CGContextRef g = UIGraphicsGetCurrentContext();
CGContextAddPath(g,path);
CGContextSetLineWidth(g,15);
CGContextReplacePathWithStrokedPath(g);
CGPath clickArea = CGContextCopyPath(g); //Not documented
UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)
所以我正在做的是创建一个图像上下文,因为它具有我需要的功能.然后我将路径添加到上下文中,并将行宽设置为15.此时描绘路径将创建我可以在其中检查以查找点击的点击区域.所以我通过告诉上下文将路径转换为描边路径,然后将该路径复制回另一个CGPath来获得该描述路径.之后,我可以查看:
if (CGPathContainsPoint(clickArea,NULL,point,NO)) { ...
Run Code Online (Sandbox Code Playgroud)
这一切都运作得很好,但是CGContextCopyPath,由于显而易见的原因,使用无证,似乎是一个坏主意.关于CGContext为此目的而做一个公正,也有一定的愚蠢.
那么,有没有人有任何想法?如何检查用户是否在任何区域附近(在这种情况下,在15个像素内)轻敲CGPath?
在我的应用程序的绘图部分,用户应该能够选择他们创建的路径。UIBezierPath有一个方便的方法containsPoint:,在大多数情况下效果很好,但是当绘制的线接近没有曲线的直线时,它会特别糟糕。让你的手指碰到一条直线是非常困难的。
该方法似乎只检查路径上很窄的一条线,即使将lineWidth路径的属性设置为较大的值也不会影响containsPoint:测试结果。
我看过类似的问题,比如这个:检测 UIBezierPath 笔触上的触摸,不是填充但无法修改解决方案以查看“路径周围的区域”,它似乎只查看中心的细线其中。
编辑
我提出的一个有效但密集的解决方案是将路径转换为 aUIImage并在请求的点检查该图像的颜色。如果 alpha 分量大于零,则路径与触摸相交。
这看起来像这样:
// pv is a view that contains our path as a property
// touchPoint is a CGPoint signifying the location of the touch
PathView *ghostPathView = [[PathView alloc] initWithFrame:pv.bounds];
ghostPathView.path = [pv.path copy]; // make a copy of the path
// 40 px is about thick enough to touch reliably
ghostPathView.path.lineWidth = 40;
// the two magic …Run Code Online (Sandbox Code Playgroud)