2011-10-01 63 views
3

我有以下的UIView架构(X,Y,宽度,高度):如何在他的父视图之外部分访问uiview子视图?

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

我的问题是子视图的底部铺设结合的MainView的之外。子视图的底部处的按钮不响应。顶部的人是响应式的,因为他们的位置也在Mainview中。

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

有没有办法使我的所有子视图都可用,即使它的一半超出了MainView的界限?

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

更新 这里是如何设计自己的看法: A =主窗口,B =的MainView,C =容器视图,d =子视图,X =在这里我要点击

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

谢谢你

+0

[uiview界限之外的交互]的可能重复(https://stackoverflow.com/questions/5432995/interaction-beyond-bounds-of-uiview) –

回答

0

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

如果这不是一个答案,我需要更多关于你想要完成的信息。

+0

如果您检查子视图(500,40)的坐标,这个视图的顶部在Mainview之上,底部在MainWindow之上。我的问题是当我点击从子视图底部的按钮。根据我的理解,因为subview属于MainView,所以我无法访问y轴80(MainView的高度)之后的部分。其实,当点击子视图的底部时,我点击MainWindow。不要,如果它是更好的:/ – peterphonic

+0

是的,事实上,如果你设置父视图剪辑子视图,你甚至不会看到子视图的那一部分。但是,你试图完成的究竟是什么? Jiri发布的内容可能适用于您的案例,但您必须手动执行PITA的操作,并消除了使用“界面”构建器的好处。 可能是一种更简单的方法来完成它是你之后。 – EricLeaf

+0

我想要做的是以下几点:MainView有一个保存按钮。当用户点击保存按钮时,它实际上会打开子视图(使用过渡动画进行后期风格),子视图中有关于保存的更多信息。当你点击子视图中的按钮时,它将处理委托给MainView。也许更好的方法是使MainWindow的子视图部分而不是?我不想这样做,因为我将不得不重新实施3班,我认为我差不多完成了=)但是,那是发展中的生活! – peterphonic

13

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

See the documentation

点摆在接收器的边界之外从不报告为 命中,即使他们实际上在于接收器的子视图中的一个内。 如果 父视图的clipsToBounds属性设置为NO,则子视图可以在视觉上超出其父项的范围。然而,点击 测试总是忽略父视图边界之外的点。

寻址评论:

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

Some hittesting is discussed here,但我无法找到它如何工作的明确解释。

Try this StackOverflow question

我没有测试过,但下面的代码可能会做你的需要:

- (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]; 
} 
+0

Thx为您的答复。我通过网络快速浏览了解如何使用hitTest。没有发现那么多。我不知道该怎么做。实际上,MainView是一个xib。我是否需要创建自己的类MainView继承UIView并重新实现hitTest? 另一个问题,即使当我点击MainView以外的地方也会打电话吗? – peterphonic

+0

@peterphonic查看更新的答案 – Jiri

+0

好的,我找到了链接[link](http://stackoverflow.com/questions/4961386/event-handling-for-ios-how-hittestwithevent-and-pointinsidewithevent-are-re )据我所知,如果我在MainView中实现hittest,当我点击子视图的底部时,此方法将不会被调用... – peterphonic

0

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

我的解决方案稍有不同,因为在我的情况下,'C'完全在'B'之外,但是'B'(并且被'B'打开)。

就我而言,我只是将'C'附加到'A',并利用@property回调函数将'C'中的更改与'B'(通过'A')进行通信。

就你而言,另一种解决方案是简单地扩展'B'的框架以包含'C' - 一旦'C'不再可见时,可以将其扩展回来。使'B'的背景清晰。

相关问题