touchesEnded:withEvent: 来自 UIScrollView 第一响应者

Posted

技术标签:

【中文标题】touchesEnded:withEvent: 来自 UIScrollView 第一响应者【英文标题】:touchesEnded:withEvent: from UIScrollView First Responder 【发布时间】:2011-01-04 18:50:58 【问题描述】:

我已将 UIScrollView 设为第一响应者。我需要在其后面的视图上维护-touchesEnded:withEvent: 方法的触摸事件。我试过使用-nextResponder 方法,但失败了。我尝试将-touchesEnded:withEvent: 转发到它背后的视图,但失败了。

如何让它工作? UIScrollView 将无法工作,除非它是第一响应者或以其他方式获取事件。

感谢您的帮助。可惜 Apple 的文档和 API 在某些方面很糟糕。

【问题讨论】:

你能展示一些你如何尝试这两种方法的代码吗? 感谢您的关注,但我的工作方式是以前没有的。 当我将超级视图设为第一响应者时,UIScrollView 现在可以工作,但即使它是第一响应者,超级视图也不会获得触摸事件。这很奇怪。 【参考方案1】:

UIScrollView 以稍微不寻常的方式处理触摸。来自类参考:

因为滚动视图没有滚动条,所以它必须知道触摸是表示滚动意图还是跟踪内容中的子视图的意图。为了做出这个决定,它通过启动一个定时器来临时拦截一个触摸事件,并在定时器触发之前,查看触摸的手指是否有任何移动。如果计时器在位置没有显着变化的情况下触发,则滚动视图将跟踪事件发送到内容视图的触摸子视图。如果用户在计时器结束之前将手指拖得足够远,则滚动视图会取消子视图中的任何跟踪并自行执行滚动...

滚动视图的内容视图中的子视图最终会收到对滚动视图的非滚动触摸。

滚动视图的超级视图不太可能看到触摸事件,因为它的-hitTest:withEvent: 将返回滚动视图,因此触摸事件将被发送到滚动视图,而无需将它们转发回响应者链到父视图查看。

第一响应者不影响触摸事件的传递,见http://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/EventsiPhoneOS/EventsiPhoneOS.html#//apple_ref/doc/uid/TP40009541-CH2-SW5

第一响应者是应用程序中的响应者对象(通常是 UIView 对象),它被指定为触摸事件以外的事件的第一个接收者...

【讨论】:

好的,谢谢,但我不知道如何绕过它。我必须绕过它。我需要获取触摸位置的区域是滚动视图所在的位置。 好的,但是您的视图应该会收到触摸。更具体的问题是您希望您的视图接收也会导致滚动视图滚动的触摸吗? 它不接收任何触摸的触摸。 :(也许模拟器des没有正确实现这个。我会用它试试我的iphone。谢谢你的帮助。 我在模拟器中的滚动视图从来没有遇到过问题,所以我认为我们需要您提供更多详细信息,您如何尝试检测对该视图的触摸以及是什么让您认为它们从未收到?如果没有看到您的实际实施,我不确定我还能提供什么。 好吧,任何其他代码都不会相关,而且有很多。我所做的只是将 UIScrollView 添加到 EAGLView,然后在 EAGLView 上添加 UIImageView,它与 UIScrollView 重叠。我在 EAGLView 上使用 touchesEnded:withevent 来确定屏幕是否在恰好是 UIImageView 的区域被触摸。 UISCrollView 必须重叠,否则会出现图形问题,即 UIScrollView 内容不会显示在部分透明的 UIImageView 下。

以上是关于touchesEnded:withEvent: 来自 UIScrollView 第一响应者的主要内容,如果未能解决你的问题,请参考以下文章

如何从 - (void)touchesEnded:withEvent: 获取 UITouch 位置的 UIView 对象?

touchesEnded:withEvent: 没有从我的 UIView 调用,它位于 UITableView 的顶部

将触摸结束事件发送到 UIControl 子类

UIResponder学习 手势

讲解iOS开发中拖动视图的实现

UIResponder 类和第一响应者角色