确定UIView是否被其他视图覆盖?

我正在构build一个简单的纸牌游戏,在这个纸牌游戏中,纸牌会弹到一个中央纸牌上,当数字变得太大时,我想开始移除底牌。 不过,我会对每张卡片应用一些随机的旋转和定位,这意味着其中一些卡片的angular落会伸出来,等等。下面是截图:

在这里输入图像说明

我想要做的是确定视图的任何部分是否对用户可见,并删除其他视图完全覆盖的视图。

视图都是实例化的,它们都在同一个超级视图内,它们都在视图的范围内,所以使用这些方法是行不通的。 我需要找出一个视图是否已被其他视图完全覆盖,在这一点上我可以安全地删除它,而用户看不到任何东西消失。

从概念上讲,您想要迭代堆栈,将卡片的path合并为一个累积path,然后检查该联合path是否与下一个联合path相等。 换句话说,如果向下添加下一条path不会改变联合path,那么它必须被完全遮蔽,因此可以被删除。 它可能看起来像这样:

UIBezierPath* accumulator = nil; for (UIView* cardView in [[[containingView subviews] copy] reverseObjectEnumerator]) { UIBezierPath* p = GetPathForView(cardView); UIBezierPath* next = PathByUnioningPaths(p, accumulator); if ([next isEqual: accumulator]) { // This view is completely obscured, remove it [cardView removeFromSuperview]; } accumulator = next; } 

当然,这个假定存在函数GetPathForViewPathByUnioningPaths 。 前者将是你的写作,但基于你创build你的卡片意见。 后者将需要某种贝塞尔path布尔运算库。 我发现这个,这似乎有一个公平的牵引: https : //bitbucket.org/martinwinter/vectorbooleancg