UIBezierPath containsPoint:无法正常工作?(更新:在superview中触摸位置如何处理?)

时间:2012-12-09 13:48:56

标签: objective-c ios uibezierpath

所以我有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中返回一个触摸位置的路径,但是在其中自己绘制?

4 个答案:

答案 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;
}

旁注:你也可以把它变成一个类别方法,我没有必要这样做。