检测 UIBezierPath 笔划上的触摸,而不是填充
可能的重复:
如何检查用户是否在附近点击CGPath?
我从这里遵循Apple的指南
尝试仅检测触摸部分的触摸事件我的 UIBezierPath。如果我使用 UIBezierPath 方法 containsPoint,它工作正常,但它会检测 UIBezierPath 的笔划和填充部分上的触摸事件,并且我希望它仅发生在笔划部分上。
按照Apple的指南(在链接的清单3-6中),我创建了这个函数:
- (BOOL)containsPoint:(CGPoint)point onPath:(UIBezierPath*)path inFillArea:(BOOL)inFill
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGPathRef cgPath = path.CGPath;
BOOL isHit = NO;
// Determine the drawing mode to use. Default to
// detecting hits on the stroked portion of the path.
CGPathDrawingMode mode = kCGPathStroke;
if (inFill)
{
// Look for hits in the fill area of the path instead.
if (path.usesEvenOddFillRule)
mode = kCGPathEOFill;
else
mode = kCGPathFill;
}
// Save the graphics state so that the path can be
// removed later.
CGContextSaveGState(context);
CGContextAddPath(context, cgPath);
// Do the hit detection.
isHit = CGContextPathContainsPoint(context, point, mode);
CGContextRestoreGState(context);
return isHit;
}
当我调用它时,我得到:
错误:CGContextSaveGState:无效的上下文0x0
错误:CGContextAddPath:无效上下文 0x0
错误:CGContextPathContainsPoint:无效上下文 0x0
错误:CGContextRestoreGState:无效的上下文 0x0
这是我的视图的drawRect函数,以及创建路径的代码:
- (UIBezierPath *) createPath {
static UIBezierPath *path = nil;
if(!path) {
path = [[UIBezierPath bezierPathWithOvalInRect:CGRectMake(35, 45, 250, 250)] retain];
path.lineWidth = 50.0;
[path closePath];
}
return path;
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
*/
- (void)drawRect:(CGRect)rect
{
// Drawing code
//draw a circle
UIBezierPath *aPath = [self createPath];
//set stroke width
aPath.lineWidth = 50.0;
//set stroke color
[[UIColor blueColor] setStroke];
//stroke path
[aPath stroke];
//close path
[aPath closePath];
//add a label at the "top"
UILabel *topLabel;
topLabel = [[UILabel alloc]initWithFrame:CGRectMake(120, -5, 80, 25)];
topLabel.text = @"The Top";
[self addSubview:topLabel];
}
然后我尝试调用touchesMoved内部的containsPoint函数,如下所示:
if (![self containsPoint:c onPath:[self createPath] inFillArea:NO]) return;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
当您当前未绘图时(如在
touchesMoved
方法中),没有当前上下文,因此UIGraphicsGetCurrentContext()
将返回 NULL。由于您对上下文所做的只是使用其当前路径,因此您也可以使用
CGPathContainsPoint
而不是CGContextPathContainsPoint
。When you're currently not drawing (as in the
touchesMoved
method), there is no current context, soUIGraphicsGetCurrentContext()
will return NULL.As all you're doing with the context is to use its current path, you could just as well use
CGPathContainsPoint
instead ofCGContextPathContainsPoint
.Apple 的示例假设您正在图形上下文中工作。你不是,所以你可以在方法中添加两行:
我
刚刚遇到了同样的问题,这为我解决了它!
Apple's example assumes you're working inside a graphics context. You're not, so you can just add two lines to the method:
and
I just ran into the same problem, and this fixed it for me!