我正在构建一个简单的纸牌游戏,其中卡片被轻弹到中央堆上,并且当数量太大时我想开始移除底部卡片。但是,我对每张卡应用了一些随机旋转和定位,这意味着其中一些卡的角落伸出,等等。这是一个截图:
我想要做的是确定用户是否可以看到视图的任何部分,并删除其他视图完全覆盖的任何部分。
视图都是实例化的,它们都在同一个超视图中,并且它们都在视图的范围内,因此使用这些方法将不起作用。我需要找出一个视图是否被其他视图完全覆盖,此时我可以安全地删除它而不会让用户看到消失的东西。
答案 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;
}
当然,这假定存在函数GetPathForView
和PathByUnioningPaths
。根据您创建卡片视图,前者将由您自己编写。后者将需要某种贝塞尔路径布尔运算库。我找到了这个,似乎有一点牵引力:https://bitbucket.org/martinwinter/vectorbooleancg