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

Eag*_*gic 9 objective-c ios

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

还有n其他通过这种方式创建的小圈子.

用户的目的是通过将它们拖放到圆圈上来完全覆盖具有较小圆圈的第一个圆圈.

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

我看过这个问题确定UIView是否被其他视图覆盖?但我不确定如何获得UIBezierPath视图层.

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

k06*_*06a 2

你可以accumulatedPath用这个答案构造确定UIView是否被其他视图覆盖?使用这种方法:

\n\n
+ (UIBezierPath *)bezierPathWithOvalInRect:(CGRect)rect\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后你可以枚举你的视图圈上的一些点并询问路径:

\n\n
- containsPoint:\n
Run Code Online (Sandbox Code Playgroud)\n\n

示例代码:

\n\n
- (BOOL)isCircleView:(UIView *)view coveredWith:(UIBezierPath *)path\n{\n    if (![path containsPoint:view.center])\n        return NO;\n    CGFloat r = CGRectGetWidth(view.bounds)/2;\n    for (CGFloat angle = 0; angle < 360; angle += 0.5) {\n        CGFloat alpha = angle/180*M_PI;\n        CGFloat x = view.center.x + r*cos(alpha);\n        CGFloat y = view.center.y + r*sin(alpha);\n        if (![path containsPoint:CGPointMake(x,y)])\n            return NO;\n    }\n    return YES;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

该算法使用圆形视图边界和中心点上的 720 个点。您将使用更多的点 \xe2\x80\x93 您将获得更准确的结果。

\n\n

但可能存在边界线被隐藏、中心被隐藏但某些部分可见的情况。所以我们可以在这个方法之前再添加一个循环return YES;

\n\n
for (CGFloat x = view.center.x - r; x < view.center.x + r; x += 4)\nfor (CGFloat y = view.center.y - r; y < view.center.y + r; y += 4)\n{\n    // Comparing distance to center with radius\n    if (pow(x-view.center.x,2)+pow(y-view.center.y,2) > pow(r,2))\n        continue;\n    if (![path containsPoint:CGPointMake(x,y)])\n        return NO;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

您还可以配置网格步骤以获得更准确的结果。

\n\n

更新:

\n\n

这是检查一个是否UIBezierPath与另一个完全重叠的更常见方法UIBezierPath。第三个参数将帮助您获得更准确的结果,尝试使用 10、100 等值。

\n\n
- (BOOL)isPath:(UIBezierPath *)path overlappedBy:(UIBezierPath *)superPath granularity:(NSInteger)granularity\n{\n    for (NSInteger i = 0; i < granularity; i++)\n    for (NSInteger j = 0; j < granularity; j++)\n    {\n        CGFloat x = CGRectGetMinX(path.bounds) + i*CGRectGetWidth(path.bounds)/granularity;\n        CGFloat y = CGRectGetMinY(path.bounds) + j*CGRectGetHeight(path.bounds)/granularity;\n        if (![path containsPoint:CGPointMake(x,y)])\n            continue;\n        if (![superPath containsPoint:CGPointMake(x,y)])\n            return NO;\n    }\n    return YES;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n