我有一个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/