我有一个小问题,我有一个代码可以在随机位置和轮换中生成200 UIImages
。
我需要检测这些图像上的触摸事件,但我需要检查触摸的UIImage
是否未被任何其他图像覆盖(即使它们在一个小区域内相交)。
有人可以帮我这个吗?
顺便说一句:我正在尝试做类似这个游戏的事情:http://www.dressup247.com/game/1014/Bank-Note-Stack.html答案 0 :(得分:3)
我建议使用背景图像将所有图像设为UIButton
,并为所有按钮设置一个动作。还有一个建议 - 设置每个按钮的标签顺序,从最低位到最高位(并在某些iVar中存储最大标签)。您可以在生成布局时执行此操作。它允许您检测点击视图的视图数量。
使用CGRectIntersectsRect
交叉视图。
-(IBAction)banknotTapped:(UIButton*)sender{
int tag = sender.tag
NSMutableArray *highestViews = [NSMutableArray array];
for (int i=sender.tag; i < biggestTag; ++i){
UIView *v = [self.view viewWithTag:i];
if (CGRectIntersectsRect(sender.frame, v.frame) ) // it allows to find intersecting views
[highestViews addObject:v];
}
}
现在highestViews
将包含与发件人相交的所有最高视图。
注意:标签允许您检测视图,但如果您要从superview中删除图像,则可能会导致问题,因为标记顺序将被破坏。隐藏视图而不是删除或遵循@Costique方法以确定视图顺序。
答案 1 :(得分:1)
您可以使用以下代码段在其父视图中确定子视图的顺序:
NSUInteger order = [containerView.subviews indexOfObjectIdenticalTo: subview];
order
越少,subview
越“高”。最顶层的子视图将为零order
。
答案 2 :(得分:1)
虽然我建议用数学方法做得更快,将纸币定义为矩形并使用分离轴定理测试重叠,这显然不是你要求的,不适用于一般情况图像
因此,我建议您创建一个与游戏区域大小相同的CGBitmapContext
,并在播放游戏区域时,为您放置的每个音符执行以下操作:
随后,当游戏开始运行缓冲区并计算每个指定颜色的数量。存储与当前可见的相同编号的所有注释都在顶部。每当删除一个注释时,按顺序重绘所有其他注释并进行一次颜色计数。
请注意,您不会在每个音符上对总缓冲区执行一次颜色计数,总共只执行一次。所以这是一个固定的成本,可能每次点击的频率低于一次。
将绘图作为单一颜色绘制的最简单方法可能是在每个图形加载后创建一个蒙版版本,然后用合适的色调绘制它。有一个alpha蒙版here的介绍;你可能想要创建一个自定义位图图像上下文,而不是使用UIGraphicsGetCurrentContext
返回的隐式图像上下文,并发布过滤器来测试输出alpha - 如果小于某个阈值则下推到0,否则高达255