2012-02-16 111 views
1

我有一个小问题,我有一个代码,以随机位置和旋转生成200 UIImages检查UIImage是否在视图顶部

我需要检测这些图像上的触摸事件,但我需要检查触及的UIImage是否未被任何其他图像覆盖(即使它们相交于一个小区域)。

有人能帮助我吗?

BTW:我试图做类似这样的游戏的东西:http://www.dressup247.com/game/1014/Bank-Note-Stack.html

+0

所以要清楚的是,触摸是不是触及'UIImage',而是UIImage是否覆盖屏幕上的任何位置?你很有意识地说图像,而不是视图,大概是因为透明部分应该适当地说明? – Tommy 2012-02-19 18:16:28

+0

@Tommy,正好,我有一个'UIImages'的一拳,用户可以触摸这些图像,并删除被触摸的只有当它是完全免费的(其他'UIImage'完全免费) – Ashraf 2012-02-20 04:43:15

回答

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将包含与发件人相交的所有最高的看法。

注意:标签允许您检测视图,但是如果您将从超级视图中删除图像,则可能会导致问题,因为标签顺序会中断。隐藏视图而不是删除或按照@Costique方法来确定视图顺序。

+0

真棒 - 谢谢你铍!你值得的+50! – Ashraf 2012-02-21 06:05:56

1

您可以使用下面的代码片段,以确定在其父视图中的子视图的顺序:

NSUInteger order = [containerView.subviews indexOfObjectIdenticalTo: subview]; 

越少order,“高”subview是。最顶端的子视图将具有零个order

+0

不错,但如何检查UIImage是否被覆盖,我想我也要检查x,y位置。 – Ashraf 2012-02-17 07:15:57

+0

@Mathboy旋转让它变得更加困难。如果不检查交叉点并依赖'UIView'的命中测试,你有没有可能做到这一点?它应该自动考虑所有转换。 – Costique 2012-02-17 09:13:58

+0

我试图做类似于这个游戏的东西:http://www.dressup247.com/game/1014/Bank-Note-Stack.html – Ashraf 2012-02-17 15:36:51

1

虽然我建议以数学方式进行此操作会更快,但要将纸币定义为矩形并使用分离轴定理等测试重叠,这显然不是您要求的而且不适合一般情况图片。

所以我建议你创建一个CGBitmapContext同样大小的游乐区和播种的游乐区时,对于每一个注意你把你做这样的事情:

  • 分配新的,尚未未使用的颜色到银行注释
  • 将其绘制到位图上下文中的目标位置,但作为指定颜色的实体对象 - 因此,您保留原始形状的轮廓,但在每个像素上绘制实体,分配颜色或根本没有颜色
  • 统计现在整个上下文中有多少像素指定的颜色,存储与您的对象代表笔记

随后,当游戏开始运行缓冲区并计算每个指定的颜色的数量。与当前可见的存储号码相同的所有备注都位于顶部。每当笔记被删除,重新绘制所有其他的顺序,并做一次颜色计数。

请注意,您没有在每个音符上对总缓冲区进行一次颜色计数,总共只进行一次。所以这是一个固定成本,可能比每次点击少一次。

大概做绘图作为一个单一的颜色最简单的方法是,当它的加载,然后得出一个合适的色调创建每个图形的掩膜版。有一个阿尔法面具介绍here;您可能需要创建一个自定义位图图像上下文,而不是使用由UIGraphicsGetCurrentContext返回的隐式位图,并过滤后测试输出alpha - 如果小于某个阈值,则将其推低至0,否则最大为255。

+0

任何代码片段? – Ashraf 2012-02-20 04:45:42