如何在父母uiview之外部分访问uiview子视图?

pet*_*nic 3 iphone uiview ipad ios

我有以下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
Run Code Online (Sandbox Code Playgroud)

我的问题是子视图的底部位于MainView的边界之外.子视图底部的按钮没有响应.顶部的那个是响应式的,因为它们的位置也在Mainview内部.

因此,当我尝试单击子视图底部的按钮时,我实际上点击了MainWindow!子视图底部按钮的位置不在MainView内部

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

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

更新 如何设计我的视图:A = MainWindow,B = MainView,C =容器视图,D =子视图,X =我要点击的位置

+----------------------------+
|A                           |
|+-------------------------+ |
||B                        | |
||            +----------+ | |
|+------------|C&D       |-+ |
|             |X         |   |
|             +----------+   |
+----------------------------+
Run Code Online (Sandbox Code Playgroud)

谢谢

Jir*_*iri 13

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

请参阅文档

位于接收者界限之外的点永远不会被报告为命中,即使它们实际上位于接收者的子视图中.如果父视图的clipsToBounds属性设置为NO,则子视图可以在视觉上超出其父视图的范围.但是,命中测试总是忽略父视图边界之外的点.

发表评论:

你应该继承UIView.然后将nib中的MainView类设置为UIView子类.

这里讨论了一些测试,但我无法找到它的工作原理.

试试这个StackOverflow问题

我还没有测试过,但以下代码可能会满足您的需求:

- (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];
}
Run Code Online (Sandbox Code Playgroud)