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