我以编程方式生成多个UIButton,然后使用块动画制作动画。我可以通过实现this answer中的代码来确定触摸了哪个按钮(如下所示)。
我现在的问题是图像可以重叠,所以当给定触摸位置有超过1个视图时,我在touchesBegan中的代码会拉出错误的按钮(即,将图像放在我看到的可见按钮下面接触)。
我想使用[触摸视图]与屏幕上的UIButtons进行比较:
if (myButton==[touch view]) { ...
但这种比较总是失败。
我的触动开始:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView:self.view];
for (UIButton *brain in activeBrains) {
//Works, but only when buttons do not overlap
if ([brain.layer.presentationLayer hitTest:touchLocation]) {
[self brainExplodes:brain];
break;
}
/* Comparison always fails
if (brain == [touch view]) {
[self brainExplodes:brain];
break;
}
*/
}
}
所以我的问题是如何确定哪个重叠图像高于另一个?
答案 0 :(得分:1)
我在这里的代码中做了一些假设,但基本上你需要得到一个已触摸的所有按钮的列表,然后找到一个'在顶部'。顶部的那个应该具有子视图数组中按钮的最高索引。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView:self.view];
NSMutableArray *brainsTouched = [[NSMutableArray alloc] init];
for (UIButton *brain in activeBrains) {
//Works, but only when buttons do not overlap
if ([brain.layer.presentationLayer hitTest:touchLocation]) {
[brainsTouched addObject:brain];
}
}
NSUInteger currentIndex;
NSInteger viewDepth = -1;
UIButton *brainOnTop;
for (UIButton *brain in brainsTouched){
currentIndex = [self.view.subviews indexOfObject:brain];
if (viewDepth < currentIndex){
brainOnTop = brain;
viewDepth = currentIndex;
}
}
[self brainExplodes:brainOnTop];
}
另外,我在编辑窗口输入了这个,请原谅错别字。
答案 1 :(得分:0)
UIView类包含一个标记属性,可用于使用整数值标记单个视图对象。您可以使用标记来唯一标识视图层次结构中的视图,并在运行时对这些视图执行搜索。 (基于标记的搜索比自己迭代视图层次更快。)tag属性的默认值为0.
要搜索标记视图,请使用UIView的viewWithTag:方法。此方法执行接收器及其子视图的深度优先搜索。它不搜索视图层次结构的超级视图或其他部分。因此,从层次结构的根视图调用此方法会搜索层次结构中的所有视图,但是从特定子视图调用它只会搜索视图的子集。
答案 2 :(得分:0)
感谢@Aaron帮助您找到一个好的解决方案。我确实为你的情况重构了你的答案以获得不可观察的性能提升(但是)更重要的是,我认为,如果我将来必须进行重构,那么读数就会减少。
回想起来,这很明显,我想,但是当然activeBrains数组反映了子视图的顺序(因为每个新的大脑在添加到超级视图后立即被添加到数组中)。因此,通过简单地向后循环通过阵列,正确的大脑正在爆炸。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView:self.view];
for(int i=activeBrains.count-1; i>=0; i--) {
UIButton *brain = [activeBrains objectAtIndex:i];
if ([brain.layer.presentationLayer hitTest:touchLocation]) {
[self explodeBrain:brain];
break;
}
}
}