我有以下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的边界之外。子视图底部的按钮没有响应。顶部的那个是响应式的,因为它们的位置也在Mainview内部。
所以当我尝试点击子视图底部的按钮时,我实际上点击了MainWindow!子视图底部按钮的位置不在MainView内部
有没有办法让我的所有子视图都可用,即使其中一半是在MainView界限之外?
我知道我可以直接在MainWindow下创建子视图,但我不想重做我的代码。
更新 在这里如何设计我的观点: A = MainWindow,B = MainView,C =容器视图,D =子视图,X =我要点击的位置
+----------------------------+
|A |
|+-------------------------+ |
||B | |
|| +----------+ | |
|+------------|C&D |-+ |
| |X | |
| +----------+ |
+----------------------------+
感谢你
答案 0 :(得分:13)
您需要在MainView中实施hitTest:(CGPoint)point withEvent:(UIEvent *)event
。
接收器范围之外的点永远不会被报告为 点击,即使他们实际上位于接收者的子视图之一。 如果是,子视图可以在视觉上超出其父级的范围 父视图的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];
}
答案 1 :(得分:0)
我不是100%确定我理解你要做什么,但是如果子视图是可见的但不在MainView中,那么从子视图到MainView的操作的唯一方法是在子视图中接收它们并传递他们进入MainView。
如果这不是答案,我需要更多关于你想要完成的事情的信息。
答案 2 :(得分:0)
我自己就解决了这个问题。和你一样,我的'B'视图启动了我的'C'视图,'B'之外的'C'部分不可用。
我的解决方案略有不同,因为在我的情况下,'C'完全在'B'之外,但是被绑定到'B'(并且由'B'打开)。
就我而言,我只是将'C'附加到'A'并使用@property回调来将'C'中的变化与'B'(通过'A')进行通信。
在你的情况下,另一种解决方案是简单地将'B'的框架扩展为包含'C' - 一旦'C'不再可见,你可以将其延伸回来。使'B'的背景清晰。