Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何访问部分位于其父uiview之外的uiview子视图?_Iphone_Ios_Ipad_Uiview - Fatal编程技术网

Iphone 如何访问部分位于其父uiview之外的uiview子视图?

Iphone 如何访问部分位于其父uiview之外的uiview子视图?,iphone,ios,ipad,uiview,Iphone,Ios,Ipad,Uiview,我有以下UIVIew架构(x、y、宽度、高度): 我的问题是子视图的底部位于MainView的边界之外。子视图底部的按钮没有响应。位于顶部的一个响应迅速,因为它们的位置也位于Mainview的内部 所以,当我尝试单击子视图底部的按钮时,我实际上单击了主窗口!子视图底部按钮的位置不在主视图内 是否有一种方法可以使我的所有子视图都可用,即使其中一半在MainView范围之外 我知道我可以直接在MainWindow下创建子视图,但是我不想重做代码 更新 以下是如何设计我的观点: A=主窗口,B=主视图

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

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

所以,当我尝试单击子视图底部的按钮时,我实际上单击了主窗口!子视图底部按钮的位置不在主视图内

是否有一种方法可以使我的所有子视图都可用,即使其中一半在MainView范围之外

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

更新 以下是如何设计我的观点: A=主窗口,B=主视图,C=容器视图,D=子视图,X=我要单击的位置

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

谢谢

我不能100%确定我是否理解您试图执行的操作,但是如果子视图可见但不在主视图中,那么从子视图到主视图获取操作的唯一方法是在子视图中接收它们并将它们传递到主视图


如果这不是一个答案,我需要更多关于您试图实现的目标的信息。

您需要在主视图中实现
hitTest:(CGPoint)pointwithevent:(UIEvent*)event

位于接收器边界之外的点永远不会报告为 点击,即使它们实际上位于接收器的一个子视图中。 如果 父视图的clipsToBounds属性设置为“否”。但是,点击 测试始终忽略父视图边界之外的点

发表评论:

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

,但我无法找到它工作原理的清晰解释

我尚未对其进行测试,但以下代码可能会满足您的需要:

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

我只是自己解决了这个问题。与您一样,我的“B”视图启动了我的“C”视图,“B”之外的“C”部分不可用

我的解决方案略有不同,因为在我的例子中,“C”完全在“B”之外,但绑定到“B”(并由“B”打开)

在我的例子中,我只是将“C”附加到“A”,并使用@property回调将“C”中的更改与“B”进行通信(通过“A”)


在您的情况下,另一个解决方案是简单地将“B”的框架扩展到包含“C”——一旦“C”不再可见,您可以将其向后扩展。使“B”的背景清晰。

如果检查子视图(500,40)的坐标,则该视图的顶部位于主视图上方,底部位于主窗口上方。我的问题是单击子视图底部的按钮时。根据我的理解,因为子视图属于MainView,所以我无法访问y轴80(MainView的高度)之后的零件。实际上,当点击子视图的底部时,我确实单击Main窗口。如果更好,请不要这样做:/Yes,事实上,如果将父视图设置为剪裁子视图,您甚至看不到子视图的该部分。但你到底想完成什么呢?Jiri所发布的内容可能适用于您的情况,但随后您必须手动执行作为PITA的操作,并删除使用Interface builder的好处。可能是一种更简单的方法来完成您所追求的目标。我想做的是:MainView有一个保存按钮。当用户单击“保存”按钮时,它实际上会打开子视图(作为post-it样式,带有过渡动画),并且子视图包含有关保存的更多信息。单击子视图中的按钮时,它会将处理委托给MainView。也许更好的方法是将子视图作为主窗口的一部分?我不想这样做,因为我将不得不重新实现3个类,我认为我几乎完成了=),但好吧,这就是开发人员的生活!不知道为什么您必须重新实现3个类才能将子视图添加到主窗口,但这可能是一件好事,因为它可能会让您了解如何更好地构造代码以处理更改。谢谢您的回复。我在网上快速浏览了一下,看看如何使用hitTest。没找到那么多。我不知道该怎么办。实际上,MainView是一个xib。我是否需要创建自己的类MainView子类UIView并重新实现hitTest?另一个问题,hittest是否会在我单击MainView外部时被调用?好的,据我所知,我找到了链接[link](),如果我在MainView中实现hittest,当我单击子视图底部时不会调用此方法…这是一个旧线程,但如果有人在寻找解决方案。。。我有一个QuadCurveMenu(来自github)作为UINavigationBar的右按钮项。只有导航栏顶部的按钮在工作。子类UINavigationBar,使用了这个实现,一切正常!谢谢Jiri!可能重复的
- (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];
}