目标 C:我可以将子视图设置为 firstResponder 吗?

Posted

技术标签:

【中文标题】目标 C:我可以将子视图设置为 firstResponder 吗?【英文标题】:Objective C: Can I set a subview to be firstResponder? 【发布时间】:2011-06-08 04:40:15 【问题描述】:

我有一种情况,我正在将另一个视图控制器的视图添加到现有的视图控制器。例如:

//set up loading page
self.myLoadingPage = [[LoadingPageViewController alloc]init ];
self.myLoadingPage.view.frame = self.view.bounds;
self.myLoadingPage.view.hidden = YES;

[self.view addSubview:self.myLoadingPage.view];

是否可以将“self.myLoadingPage”设置为第一响应者?在这种情况下,loadingpage 视图大小不会覆盖现有视图的整个大小,并且用户仍然可以与超级视图交互(这不是所需的行为)。在这种情况下,我只想启用子视图。

【问题讨论】:

【参考方案1】:

当我遇到类似问题时,我制作了一个覆盖整个屏幕的不可见 UIView,我在主视图顶部添加了大的不可见 UIView,并使加载视图成为不可见 UIView 的子视图。

【讨论】:

【参考方案2】:

最简单的解决方案是在加载视图中覆盖 hitTest 方法以返回 TRUE。这个顶部视图是响应者链中的第一个,调用 hitTest 方法,如果该点在视图内并因此将被处理,则该方法通常返回 TRUE,无论您获得触摸事件并有效阻止消息被重新发送到下一个响应者。

【讨论】:

【参考方案3】:

有趣的问题。我找到了一个类似的post,并引用了苹果开发者论坛关于这个问题的引述:

真正让这个观点成为唯一的事情 在可以接收触摸的屏幕上 您需要添加另一个视图 最重要的是要赶上 其余的接触,或子类 a 查看层次结构中的某处(或 你的 UIWindow 本身)并覆盖 hitTest:withEvent: 总是返回 您的文本视图可见时,或 为不在你的触摸中返回 nil 文本视图。

这似乎表明没有一个非常简单的解决方案(除非在 2010 年 10 月之后对此进行了 API 更改。)

或者,我想您可以通过 superview 中的所有其他 subviews 并将它们的 userInteractionEnabled 属性单独设置为 NO(但这可能会比引用的解决方案更麻烦)。

我希望看到其他方法来实现这一点。

【讨论】:

以上是关于目标 C:我可以将子视图设置为 firstResponder 吗?的主要内容,如果未能解决你的问题,请参考以下文章

将子视图布局锚设置为 UIScrollView

如何将子视图上的触摸事件的坐标转换为其父视图中的坐标?

(iphone)将子视图的框架设置在超视图的范围之外?

NSLayoutConstraint - 无法将子视图框架设置为父视图边界

将子视图添加到选定的表格视图单元格

将子视图添加到更漂亮的视图中?