我正在构建一个简单的纸牌游戏,将纸牌轻弹到中央堆上,当数字太大时,我想开始移除底部的牌。但是,我对每张卡片应用了一些随机旋转和定位,这意味着其中一些卡片的角会突出,等等。这是一个屏幕截图:
我想做的是确定视图的任何部分是否对用户可见,并删除完全被其他视图覆盖的任何部分。
视图都是实例化的,它们都在同一个父视图内,并且都在视图的范围内,所以使用这些方法是行不通的。我需要确定一个视图是否已被其他视图完全覆盖,此时我可以安全地删除它,而用户不会看到某些东西消失。
我正在构建一个简单的纸牌游戏,将纸牌轻弹到中央堆上,当数字太大时,我想开始移除底部的牌。但是,我对每张卡片应用了一些随机旋转和定位,这意味着其中一些卡片的角会突出,等等。这是一个屏幕截图:
我想做的是确定视图的任何部分是否对用户可见,并删除完全被其他视图覆盖的任何部分。
视图都是实例化的,它们都在同一个父视图内,并且都在视图的范围内,所以使用这些方法是行不通的。我需要确定一个视图是否已被其他视图完全覆盖,此时我可以安全地删除它,而用户不会看到某些东西消失。
从概念上讲,您希望向下迭代堆栈,将卡片的路径合并为累积路径,然后检查该联合路径与下一个联合路径是否相等。换句话说,如果向下添加下一条路径不会改变联合路径,那么它必须完全被遮挡,因此可以被移除。它可能看起来像这样:
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