我有一个小问题,我有一个代码,以随机位置和旋转生成200 UIImages
。检查UIImage是否在视图顶部
我需要检测这些图像上的触摸事件,但我需要检查触及的UIImage
是否未被任何其他图像覆盖(即使它们相交于一个小区域)。
有人能帮助我吗?
BTW:我试图做类似这样的游戏的东西:http://www.dressup247.com/game/1014/Bank-Note-Stack.html
我有一个小问题,我有一个代码,以随机位置和旋转生成200 UIImages
。检查UIImage是否在视图顶部
我需要检测这些图像上的触摸事件,但我需要检查触及的UIImage
是否未被任何其他图像覆盖(即使它们相交于一个小区域)。
有人能帮助我吗?
BTW:我试图做类似这样的游戏的东西:http://www.dressup247.com/game/1014/Bank-Note-Stack.html
我建议让所有图像作为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
将包含与发件人相交的所有最高的看法。
注意:标签允许您检测视图,但是如果您将从超级视图中删除图像,则可能会导致问题,因为标签顺序会中断。隐藏视图而不是删除或按照@Costique方法来确定视图顺序。
真棒 - 谢谢你铍!你值得的+50! – Ashraf 2012-02-21 06:05:56
您可以使用下面的代码片段,以确定在其父视图中的子视图的顺序:
NSUInteger order = [containerView.subviews indexOfObjectIdenticalTo: subview];
越少order
,“高”subview
是。最顶端的子视图将具有零个order
。
虽然我建议以数学方式进行此操作会更快,但要将纸币定义为矩形并使用分离轴定理等测试重叠,这显然不是您要求的而且不适合一般情况图片。
所以我建议你创建一个CGBitmapContext
同样大小的游乐区和播种的游乐区时,对于每一个注意你把你做这样的事情:
随后,当游戏开始运行缓冲区并计算每个指定的颜色的数量。与当前可见的存储号码相同的所有备注都位于顶部。每当笔记被删除,重新绘制所有其他的顺序,并做一次颜色计数。
请注意,您没有在每个音符上对总缓冲区进行一次颜色计数,总共只进行一次。所以这是一个固定成本,可能比每次点击少一次。
大概做绘图作为一个单一的颜色最简单的方法是,当它的加载,然后得出一个合适的色调创建每个图形的掩膜版。有一个阿尔法面具介绍here;您可能需要创建一个自定义位图图像上下文,而不是使用由UIGraphicsGetCurrentContext
返回的隐式位图,并过滤后测试输出alpha - 如果小于某个阈值,则将其推低至0,否则最大为255。
任何代码片段? – Ashraf 2012-02-20 04:45:42
所以要清楚的是,触摸是不是触及'UIImage',而是UIImage是否覆盖屏幕上的任何位置?你很有意识地说图像,而不是视图,大概是因为透明部分应该适当地说明? – Tommy 2012-02-19 18:16:28
@Tommy,正好,我有一个'UIImages'的一拳,用户可以触摸这些图像,并删除被触摸的只有当它是完全免费的(其他'UIImage'完全免费) – Ashraf 2012-02-20 04:43:15