答案 0 :(得分:1)
扩展路径的宽度实际上非常困难。但是,你可以用更宽的宽度来抚摸它并获得几乎相同的效果。有点像...
CGContextSetRGBStrokeColor(context, 0.4, 0.4, 0.4, 1.0);
[path setLineWidth:15];
[path stroke];
CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0);
[path setLineWidth:3];
[path stroke];
...会产生类似你问题中的图片。但我怀疑这是对你的新闻。
真正的诀窍是测试“画线是否属于缓冲区”。这个问题与我在another question中为自己回答的问题非常相似。看看我在那里分享的LineSample.zip代码。这实现了位图/按位数据比较,以便像您需要的那样检测线上的命中。您可以将较粗的“缓冲”路径绘制到位图中进行测试,并在视图中显示较细的线条。
答案 1 :(得分:0)
基本上,您要检查是否有任何点落在路径周围指定大小的区域内。
实际上这很简单。首先,您需要一个值来定义要测试的路径周围的空间量。我们说20分。所以你需要做的是启动一个FOR循环,从-20到20开始,并在每次迭代时,创建路径的副本,转换路径的x和y co-odrinates,检查每个路径。
在此代码示例中,所有这些都更加清晰。
CGPoint touchPoint = /*get the point*/;
NSInteger space = 20;
for (NSInteger i = -space; i < space; i++) {
UIBezierPath *pathX = [UIBezierPath bezierPathWithCGPath:originalPath.CGPath];
[pathX applyTransform:CGAffineTransformMakeTranslation(i, 0)];
if ([pathX containsPoint:touchPoint]) {
/*YEAH!*/
}
else {
UIBezierPath *pathY = [UIBezierPath bezierPathWithCGPath:originalPath.CGPath];
[pathY applyTransform:CGAffineTransformMakeTranslation(0, i)];
if ([pathY containsPoint:touchPoint]) {
/*YEAH!*/
}
}
}