我有UIView
我调整了它的图层,使其显示为圆圈。 (view.layer.cornerRadius = view.frame.size.height/2
)
还有n
个以这种方式创建的小圈子。
用户的目的是通过将圆圈拖放到圆圈上来完全覆盖第一个圆圈。
如何检查大圆圈是否完全被覆盖?
我已经查看了这个问题Determine whether UIView is covered by other views?,但我不确定如何获取视图图层的UIBezierPath
。
感谢任何帮助,谢谢!
答案 0 :(得分:2)
您可以使用此方法使用此答案Determine whether UIView is covered by other views?构建accumulatedPath
:
+ (UIBezierPath *)bezierPathWithOvalInRect:(CGRect)rect
然后你可以枚举你查看圈子上的一些点并询问路径:
- containsPoint:
示例代码:
- (BOOL)isCircleView:(UIView *)view coveredWith:(UIBezierPath *)path
{
if (![path containsPoint:view.center])
return NO;
CGFloat r = CGRectGetWidth(view.bounds)/2;
for (CGFloat angle = 0; angle < 360; angle += 0.5) {
CGFloat alpha = angle/180*M_PI;
CGFloat x = view.center.x + r*cos(alpha);
CGFloat y = view.center.y + r*sin(alpha);
if (![path containsPoint:CGPointMake(x,y)])
return NO;
}
return YES;
}
此算法在您的圆视图边界和中心点上使用720个点。您将获得更多积分 - 您将获得更准确的结果。
但是当隐藏边界线并隐藏中心但有些部分可见时,可能存在这种情况。因此,我们可以在return YES;
:
for (CGFloat x = view.center.x - r; x < view.center.x + r; x += 4)
for (CGFloat y = view.center.y - r; y < view.center.y + r; y += 4)
{
// Comparing distance to center with radius
if (pow(x-view.center.x,2)+pow(y-view.center.y,2) > pow(r,2))
continue;
if (![path containsPoint:CGPointMake(x,y)])
return NO;
}
您还可以配置网格步骤以获得更准确的结果。
<强>更新强>
以下是检查一个UIBezierPath
是否与另一个UIBezierPath
完全重叠的更常用方法。第三个参数将帮助您获得更准确的结果,尝试使用像10,100这样的值。
- (BOOL)isPath:(UIBezierPath *)path overlappedBy:(UIBezierPath *)superPath granularity:(NSInteger)granularity
{
for (NSInteger i = 0; i < granularity; i++)
for (NSInteger j = 0; j < granularity; j++)
{
CGFloat x = CGRectGetMinX(path.bounds) + i*CGRectGetWidth(path.bounds)/granularity;
CGFloat y = CGRectGetMinY(path.bounds) + j*CGRectGetHeight(path.bounds)/granularity;
if (![path containsPoint:CGPointMake(x,y)])
continue;
if (![superPath containsPoint:CGPointMake(x,y)])
return NO;
}
return YES;
}
对于圆形情况,我建议使用第一种解决方案,对于随机形状 - 第二种解决方案。
答案 1 :(得分:1)
要获取UIBezierPath
视图,您可以使用此方法:
+ (UIBezierPath *)bezierPathWithOvalInRect:(CGRect)rect
使用视图框架作为矩形。由于您的视图具有方形形状,因此您将获得与您的圆圈对应的UIBezierPath
。
然后,将所有路径组合成一个与原始圆路径比较的路径。
答案 2 :(得分:0)
还有另一种可能的解决方案来获得视图的bezier路径。您应该创建一个UIView类。使此类成为所有圆视图的父级。还将UIBezierPath声明为属性。创建任何圆视图时,请指定bezier路径。 下次触摸视图时,您可以通过访问其属性来获取其路径。