2

所以我有 2 个 UIViews 女巫可以绘制一个 bezierpath 然后返回路径。然后我需要检查路径是否包含我在帮助下执行此操作的点[path containsPoint:currentObject.position],它适用于其中一个视图,但不适用于另一个视图。一个视图位于 iPhone 的上半部分,另一个视图位于下半部分。最下面的那个不行。我试图切换视图,然后它是同样的问题,底部的不起作用。

这是一些代码:

在主视图控制器中:

-(void)didEndPath:(UIBezierPath *)path DrawView:(DrawView *)draw {
    if ([path containsPoint:currentObject.position]) {
        //do stuff
    }
}

在drawview touches结束时我这样做:

[self.delegate didEndPath:currentPath DrawView:self];

为什么它不起作用,是不是视图有另一个来源然后self.view?我如何解决它?

编辑:

好的,所以我找到了问题,但没有找到解决方案。

如果我将 UIView 中的触摸方法从 this: startPoint = [touch locationInView:self];更改为 this,startPoint = [touch locationInView:self.superview];那么它会正确读取触摸,但我的路径不会绘制。问题仍然只是底部的uiview。那么我该如何更改,以便它在超级视图中返回一个带有触摸位置的路径,但在它自己内部绘制它?

4

4 回答 4

1

我通过制作2条路径解决了这个问题。一个有superview的观点,一个没有。它有效,但我不知道它是否是最好的解决方案。

于 2012-12-09T17:04:28.563 回答
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。

于 2012-12-09T15:02:03.653 回答
0

您应该能够像这样转换视图之间的点

CGPoint locationInSuperView = [self convertPoint:point toView:self.superview];
于 2012-12-10T00:03:07.877 回答
0

我有一个类似的问题,containsPoint:总是返回NO

我最终制作了自己的方法来检查是否CGPointboundsUIBezierPath

- (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;
}

旁注:你也可以把它变成一个类别方法,我不需要那个。

于 2014-03-24T09:44:18.390 回答