如何在他的父视图之外部分访问子视图子视图?

我有以下的UIVIew架构(x,y,宽度,高度):

- MainWindow (0,0,768,1024) - MainView (0,0,768,80) - containerview (500,40,120,80) - subview (500,40,120,80) -some buttons 

我的问题是,子视图的底部不在MainView的边界之外。 子视图底部的button不响应。 顶部的那个是响应式的,因为他们的位置也在Mainview中。

所以当我尝试点击子视图底部的button,我实际上点击MainWindow! 子视图底部button的位置不在MainView中

有没有办法让所有我的子视图可用,即使它的一半是在MainView绑定?

我知道我可以直接在MainWindow下创build子视图,但我不想重做我的代码。

更新这里如何devise我的意见:A = MainWindow,B = MainView,C =容器视图,D =子视图,X =我想要点击

 +----------------------------+ |A | |+-------------------------+ | ||B | | || +----------+ | | |+------------|C&D |-+ | | |X | | | +----------+ | +----------------------------+ 

谢谢

您需要在MainView中实现hitTest:(CGPoint)point withEvent:(UIEvent *)event

请参阅文档

位于接收方边界之外的点不会被报告为点击,即使它们实际上位于接收方的子视图之一内。 如果父视图的clipsToBounds属性设置为NO,则子视图可以在视觉上超出父视图的范围。 然而,命中testing总是忽略父视图边界之外的点。

发表评论:

你应该inheritanceUIView。 然后将nib中的MainView类设置为您的UIView子类。

一些hittesting在这里讨论 ,但我无法find如何工作的明确解释。

试试这个StackOverflow的问题

我还没有testing过,但下面的代码可能会做你所需要的:

 - (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event { for(UIView *subview in self.subviews) { UIView *view = [subview hitTest:[self convertPoint:point toView:subview] withEvent:event]; if(view) return view; } return [super hitTest:point withEvent:event]; } 

我不是100%确定我明白你想要做什么,但是如果子视图是可见的,但不在MainView中,那么从子视图到主视图的操作的唯一方法是在子视图中接收它们并将它们传递到MainView 。

如果这不是一个答案,我需要更多的信息,你正在努力完成。

我自己解决了这个问题。 和你一样,我的'B'视图启动了'C'视图,'B'外的'C'部分不可用。

我的解决scheme略有不同,因为在我的情况下,“C”完全在“B”之外(但是被“B”打开)。

就我而言,我只是简单地将'C'附加到'A',并利用@propertycallback来将'C'中的变化与'B'(通过'A')进行通信。

在你的情况下,另一个解决scheme是简单地扩展'B'的框架来包含'C' – 一旦'C'不再可见,你可以将其扩展回来。 使'B'的背景清晰。