2011-08-02 35 views
6

我有两个视图检测另一个视图背后的视图?

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

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

但是,我无法检测到底视图上的按钮点击,因为topview阻止了它,我该怎么办?

无论如何让顶级视图通过底部视图触及?

回答

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); 
} 

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

+0

我需要做到这一点,但我不明白如何:倾听结束:withEvent委托等与子类别的视图。给我打电话,但我需要看到它。 – Morkrom

1

关闭用户交互是下面遮挡住了顶视图:

topView.userInteractionEnabled = NO; 
+0

不幸的是,顶视图是一个可滚动的视图...需要交互。很高兴.. – mkto

1

如果你不想顶视图(或任何其子视图)向触摸任何反应,你可以将该视图的userInteractionEnabled属性设置为NO,并用它来完成。

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

+0

不幸的是,顶视图是一个可滚动的视图...需要交互。我会研究你的第二个建议......谢谢..将更新它,我得到了任何东西。同时任何人有其他建议请让我知道。 – mkto