Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c UIBezierPath包含点:don';无法正常工作?(更新:触摸superview中的位置如何处理?)_Objective C_Ios_Uibezierpath - Fatal编程技术网

Objective c UIBezierPath包含点:don';无法正常工作?(更新:触摸superview中的位置如何处理?)

Objective c UIBezierPath包含点:don';无法正常工作?(更新:触摸superview中的位置如何处理?),objective-c,ios,uibezierpath,Objective C,Ios,Uibezierpath,所以我有两个UI视图,它们可以绘制bezierpath,然后返回路径。然后我需要检查路径是否包含一个点,我在[path containsPoint:currentObject.position]的帮助下执行此操作,并且它对其中一个视图有效,但对另一个视图无效。 一个视图位于iPhone的上半部分,另一个视图位于下半部分。底部的那个坏了。 我试着切换视图,结果还是一样的问题,底部的那个不起作用 下面是一些代码: 在mainviewcontroller中: -(void)didEndPath:(UI

所以我有两个UI视图,它们可以绘制bezierpath,然后返回路径。然后我需要检查路径是否包含一个点,我在
[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吗?我怎么修理它

编辑:

好的,我找到了问题,但没有找到解决办法

如果我从以下位置更改UIView中的触摸方式:
startPoint=[touch locationInView:self]到此
startPoint=[touch locationInView:self.superview]然后它正确读取触摸,但我的路径不会绘制。问题仍然只存在于底部视图。那么,我如何更改它,使其返回一个在superview中具有触碰位置的路径,但在其内部自行绘制?

查看文档:

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.

我通过创建两条路径解决了这个问题。一个有来自superview的点,另一个没有。它可以工作,但我不知道它是否是最好的解决方案。

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

CGPoint locationInSuperView = [self convertPoint:point toView:self.superview];

我遇到了一个类似的问题,其中
包含点:
始终返回

我最终制定了自己的方法来检查
CGPoint
是否在
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;
}
-(BOOL)bezierPath:(UIBezierPath*)bezierPath包含点:(CGPoint)点
{
CGRect bezierRect=bezierPath.bounds;
如果(bezierRect.origin.xpoint.x&&
bezierRect.origin.ypoint.y){
返回YES;
}
返回否;
}

旁注:你也可以把它变成一个分类方法,我不需要这样做。

BezierPAth中包含的内容:路径是否有一些自相交?@AlexWien只是一条没有自相交的闭合路径。
currentObject.position
与BezierPAth在同一坐标系中吗?我经常使用
containsPoint:
而不发生意外。@rsswtmr实际上我现在发现这就是问题所在,但你知道我如何解决它吗?不,它已关闭。但我现在已经找到了问题的起点,我已经更新了问题。请确保您使用drawRect方法进行绘制。我确实这样做了,但现在的问题是,如果我使用superView中的点创建路径,那么containsPoint方法可以工作。但是路径不会在正确的位置绘制自身,但是如果我做相反的操作,containsPoint方法将不起作用,但是路径将正确绘制。是否可以一次转换整个路径?是和否。并排构建两条路径会更容易。如果你想在事后做这件事,你可以看看使用
cgpathpapply
构建第二条路径。是的,这就是我的想法,然后我坚持我的解决方案,并排创建路径。出于兴趣,为什么你需要实际构建两条路径?在检查点是否在该路径中之前,是否可以先使用一条路径,然后使用上述方法转换点?我需要一条路径在其自己的视图中绘制(在drawRect中)。但它返回另一条路径,如果该路径包含superview中的点,则会检查该路径。我可以使用你的方法,但我认为创建两条路径对于这个项目来说更简单。你也可以使用CGRectContainsPoint,而不是写出if语句