检查 UIImage 是不是在视图顶部
Posted
技术标签:
【中文标题】检查 UIImage 是不是在视图顶部【英文标题】:Check if UIImage is on the top of view检查 UIImage 是否在视图顶部 【发布时间】:2012-02-16 18:36:18 【问题描述】:我有一个小问题,我有一个代码可以在随机位置和旋转中生成 200 个UIImages
。
我需要检测这些图像上的触摸事件,但我需要检查触摸的UIImage
是否没有被任何其他图像覆盖(即使它们相交在一个小区域内)。
有人可以帮我解决这个问题吗?
顺便说一句:我正在尝试做一些类似于这个游戏的事情:http://www.dressup247.com/game/1014/Bank-Note-Stack.html
【问题讨论】:
所以要明确一点,这不是触摸是否击中UIImage
,而是UIImage
是否在屏幕上的任何位置被覆盖?而且您故意说图像而不是视图,大概是因为应该适当考虑透明部分?
@Tommy,没错,我有一拳UIImages
,用户可以触摸这些图像并删除触摸的图像,前提是它完全免费(其他UIImage
根本没有覆盖)
【参考方案1】:
我建议将所有图像设为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 方法以确定视图顺序。
【讨论】:
【参考方案2】:您可以使用以下sn-p来确定子视图在其父视图中的顺序:
NSUInteger order = [containerView.subviews indexOfObjectIdenticalTo: subview];
order
越少,subview
就“更高”。最顶层的子视图将有零 order
。
【讨论】:
不错,但是如何检查 UIImage 是否被覆盖,我想我也必须检查 x,y 位置。 @Mathboy 旋转使它变得更加困难。您是否有机会不检查交叉路口并依靠UIView
的命中测试?它应该自动考虑所有转换。
我正在尝试做一些类似于这个游戏的事情:dressup247.com/game/1014/Bank-Note-Stack.html【参考方案3】:
虽然我建议在数学上执行此操作会更快,将纸币定义为矩形并使用分离轴定理之类的东西测试重叠,但这显然不是您要问的,也不适合一般案例图像.
因此,我建议您创建一个与您的游戏区大小相同的CGBitmapContext
,并且在为您的游戏区播种时,对于您放置的每个音符,您都可以执行以下操作:
随后,当游戏开始时,运行缓冲区并计算每种分配颜色的数量。与当前可见存储的编号相同的所有笔记都位于顶部。每当删除一个便笺时,按顺序重新绘制所有其他便笺并计算一次颜色。
请注意,您不是对每个音符的总缓冲区进行一次颜色计数,而是总共只计算一次。因此,这是一个固定成本,并且每次点击可能发生的频率低于一次。
可能最简单的以单一颜色进行绘图的方法是在加载每个图形时为其创建一个蒙版版本,然后使用合适的色调进行绘制。有一个关于 alpha 掩码的介绍here;您可能希望创建一个自定义位图图像上下文,而不是使用 UIGraphicsGetCurrentContext
返回的隐式上下文,并发布过滤器以测试输出 alpha — 如果它小于某个阈值,则将其推低至 0,否则推至 255。
【讨论】:
以上是关于检查 UIImage 是不是在视图顶部的主要内容,如果未能解决你的问题,请参考以下文章
检查 UIImageView 中的图像不是占位符图像并附加到 UIImage 数组
如何在 UIScrollView 内使用 Autolayout 将 UIImage 视图缩放为正方形