获取2个或更多视图重叠时动画时触摸的可见UIButton?

时间:2012-05-06 22:02:11

标签: ios uibutton touch

我以编程方式生成多个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;
        }
        */
    }
}

所以我的问题是如何确定哪个重叠图像高于另一个?

3 个答案:

答案 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;
        }
    }
}