我有一个UIView,我已经调整了它的图层以使其显示为圆形。 (view.layer.cornerRadius = view.frame.size.height/2)

还通过这种方式创建了n其他较小的圈子。

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

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

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

任何帮助表示赞赏,谢谢!

最佳答案

您可以使用以下方法使用此答案Determine whether UIView is covered by other views?构造accumulatedPath:

+ (UIBezierPath *)bezierPathWithOvalInRect:(CGRect)rect

然后,您可以枚举 View 圆上的一些点并询问有关以下内容的路径:
- 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;
}

该算法在圆 View 边界和中心点上使用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;
}

对于圆形情况,我建议对随机形状使用第一个解决方案,第二个解决方案。

关于ios - 检查 View 完全被其他 View 覆盖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30776375/

10-12 06:15