所以我有2个UIViews女巫可以画一条bezier路径然后返回路径。然后我需要检查路径是否包含我在[path containsPoint:currentObject.position]
的帮助下执行此操作的点,它适用于其中一个视图但不适用于另一个视图。
一个视图位于iPhone的上半部分,另一个视图位于下半部分。底部的那个不起作用。
我试图切换视图,然后是同样的问题,底部的不起作用。
以下是一些代码:
在mainviewcontroller中:
-(void)didEndPath:(UIBezierPath *)path DrawView:(DrawView *)draw {
if ([path containsPoint:currentObject.position]) {
//do stuff
}
}
并且在drawview接触结束时我这样做:
[self.delegate didEndPath:currentPath DrawView:self];
为什么它不起作用,是否视图有另一个起源然后是self.view?我该如何解决?
编辑:
Okey,所以我发现了问题但不是解决方案。
如果我更改了我的UIView中的触摸方法:
startPoint = [touch locationInView:self];
对此startPoint = [touch locationInView:self.superview];
然后它会正确读取触摸但我的路径不会绘制。问题仍然存在于底层uiview。那么我该如何改变呢,它会在superview中返回一个触摸位置的路径,但是在其中自己绘制?
答案 0 :(得分:1)
我通过制作2条路径解决了这个问题。一个来自superview,一个没有。它有效,但我不知道它是否是最好的解决方案。
答案 1 :(得分:0)
查看文档:
A point is not considered to be enclosed by the path if it is inside an open subpath,
regardless of whether that area would be painted during a fill operation. Therefore, to
determine mouse hits on open paths, you must create a copy of the path object and
explicitly close any subpaths (using the closePath method) before calling this method.
我的猜测是你打开了一个子路径,所以containsPoint返回NO。
答案 2 :(得分:0)
您应该能够像这样转换视图之间的点
CGPoint locationInSuperView = [self convertPoint:point toView:self.superview];
答案 3 :(得分:0)
我遇到了类似的问题,containsPoint:
始终返回NO
我最终制作了自己的方法来检查CGPoint
是否在bounds
UIBezierPath
范围内
- (BOOL)bezierPath:(UIBezierPath*)bezierPath containsPoint:(CGPoint)point
{
CGRect bezierRect = bezierPath.bounds;
if( bezierRect.origin.x < point.x && bezierRect.origin.x + bezierRect.size.width > point.x &&
bezierRect.origin.y < point.y && bezierRect.origin.y + bezierRect.size.height > point.y ){
return YES;
}
return NO;
}
旁注:你也可以把它变成一个类别方法,我没有必要这样做。