检测另一个视图后面的视图上的触摸?

时间:2011-08-02 12:02:03

标签: objective-c

我有两个观点

  • 顶视图有一些不透明区域和一些透明区域
  • 底部视图有一些可点击的按钮。

顶视图完全覆盖底部视图,但由于顶视图具有透明区域,因此仍可以看到底部视图。

但是,由于topview阻止它,我无法再检测到底部视图上的按钮点击,我该怎么办?

是否有顶视图将触摸传递到底部视图?

3 个答案:

答案 0 :(得分:4)

我自己的问题的解决方案,希望它有助于某人。

在前视图中,收听touchesEnded:withEvent代表。

当此委托触发时,您知道用户正在触摸前视图。

接下来,您需要检查手指位置是否接触BOTTOM视图中的特殊区域。

该怎么做:

1)将点转换为相对底部视图:

UITouch *touch = [touches anyObject];
CGPoint touchPointInLowerView = [touch locationInView:self.lowerViewController.view];
BOOL isLowerButtonClicked = [self.lowerViewController isFingerOnYourButton:touchPointInLowerView];
if(isLowerButtonClicked)
{
 // lower button clicked
}

2)在下方视图中

- (BOOL) isFingerOnYourButton:(CGPoint)point
{
 return CGRectContainsPoint(self.aButton.frame, point);
}  

瞧。通过这种方式,我们可以检测底部视图中的点击,即使它被顶部的另一个交互式视图阻止。

答案 1 :(得分:1)

在顶部视图中关闭阻止下方视图的用户互动:

topView.userInteractionEnabled = NO;

答案 2 :(得分:1)

如果您不希望顶视图(或其任何子视图)完全响应触摸,则可以将该视图的userInteractionEnabled属性设置为NO并使用它完成。

否则,您最好的选择是覆盖顶级视图中的pointInside:withEvent:hitTest:withEvent:。如果顶视图和底视图是兄弟姐妹,那么它应该足以从pointInside:withEvent:返回NO;如果它们在视图层次结构中进一步分隔,则可能必须覆盖hitTest:withEvent:以显式返回透明区域的底部视图。