其他视图完全覆盖了检查视图

时间:2015-06-11 09:09:53

标签: ios objective-c

我有UIView我调整了它的图层,使其显示为圆圈。 (view.layer.cornerRadius = view.frame.size.height/2

还有n个以这种方式创建的小圈子。

用户的目的是通过将圆圈拖放到圆圈上来完全覆盖第一个圆圈。

如何检查大圆圈是否完全被覆盖?

我已经查看了这个问题Determine whether UIView is covered by other views?,但我不确定如何获取视图图层的UIBezierPath

感谢任何帮助,谢谢!

3 个答案:

答案 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路径。 下次触摸视图时,您可以通过访问其属性来获取其路径。