2

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

在此处输入图像描述

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

视图都是实例化的,它们都在同一个父视图内,并且都在视图的范围内,所以使用这些方法是行不通的。我需要确定一个视图是否已被其他视图完全覆盖,此时我可以安全地删除它,而用户不会看到某些东西消失。

4

1 回答 1

2

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

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;
}

当然,这假定函数GetPathForView和的存在PathByUnioningPaths。前者将由您编写,具体取决于您创建卡片视图的方式。后者将需要某种贝塞尔路径布尔运算库。我找到了这个,它似乎有相当大的吸引力:https ://bitbucket.org/martinwinter/vectorbooleancg

于 2015-02-01T17:59:50.890 回答