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

时间:2015-02-01 17:04:09

标签: ios objective-c uiview uiview-hierarchy

我正在构建一个简单的纸牌游戏,其中卡片被轻弹到中央堆上,并且当数量太大时我想开始移除底部卡片。但是,我对每张卡应用了一些随机旋转和定位,这意味着其中一些卡的角落伸出,等等。这是一个截图:

enter image description here

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

视图都是实例化的,它们都在同一个超视图中,并且它们都在视图的范围内,因此使用这些方法将不起作用。我需要找出一个视图是否被其他视图完全覆盖,此时我可以安全地删除它而不会让用户看到消失的东西。

1 个答案:

答案 0 :(得分:2)

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

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。根据您创建卡片视图,前者将由您自己编写。后者将需要某种贝塞尔路径布尔运算库。我找到了这个,似乎有一点牵引力:https://bitbucket.org/martinwinter/vectorbooleancg