如何从 UIScrollView 窃取触摸?

2024-01-05

今天,在我的创作时间里,我做了一些相当全面的研究,了解如何从 UIScrollView 窃取触摸并将它们立即发送到特定的子视图,同时保持滚动视图其余部分的默认行为。考虑在 UITableView 中包含 UIPickerView。默认行为是,如果您将手指拖动到选取器视图上,滚动视图将滚动,而选取器视图将保持不变。

我尝试的第一件事是覆盖

- (BOOL)touchesShouldCancelInContentView:(UIView *)view

并且根本不允许 UIScrollView 取消选择器视图内的触摸。这确实有效,但有一个令人不快的副作用。您希望选择器视图立即响应,因此您必须设置delaysContentTouches到NO。问题是您不希望表视图的其余部分立即响应,因为如果这样做,表视图单元格将始终在滚动开始之前突出显示几毫秒。

我尝试的第二件事是覆盖

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

因为我读过滚动视图总是返回自身,这样它就会从子视图中“窃取”触摸,然后如果滚动视图不感兴趣的话将它们发送到子视图。然而,这已经不再是事实了。 UIScrollView 的 hitTest:withEvent: 默认实现实际上返回应该接收触摸的子视图。相反,它使用手势识别器来拦截触摸。

因此,我尝试的第三件事是实现我自己的手势识别器,如果触摸位于选择器视图之外,则会导致其失败,否则会成功。然后,我将所有滚动视图的手势识别器设置为失败,除非我的手势识别器使用以下代码失败:

for (UIGestureRecognizer * gestureRecognizer in self.tableView.gestureRecognizers)
{
    [gestureRecognizer requireGestureRecognizerToFail:myRecognizer];
}

事实上,这确实从滚动视图中窃取了触摸,但选择器视图永远不会收到它们。所以我想也许我可以使用以下代码发送我的手势识别器接收到的所有触摸:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    for (UITouch *touch in touches)
        [touch.view touchesBegan:touches withEvent:event];
}

上面的代码是一个简化版本。我还确保该视图是选取器视图(或其子视图之一),并为手势识别器设置适当的状态,如上所述。我也对取消、结束和移动做了同样的事情。然而,选择器视图仍然没有响应。

在回到正常工作之前,我还尝试了最后一件事。在我广泛的谷歌搜索中,我读到嵌套的 UIScrollViews 从 3.x 开始就神奇地工作了,所以我尝试将我的选择器视图放入嵌套的 UIScrollView 中并在其上设置以下属性:

scrollView.delaysContentTouches = NO;
scrollView.canCancelContentTouches = NO;

正如人们所期望的那样,外部滚动视图对待内部滚动视图的方式与对待选择器视图的方式没有任何不同,因此内部滚动视图没有接收到触摸。我认为这是一个不太可能的尝试,但它很容易实现,所以我认为值得一试。

我所知道的是 UIScrollView 有一个名为的手势识别器UIScrollViewDelayedTouchesBeganGestureRecognizer拦截触摸并在 150(?)ms 后将它们发送到适当的子视图。我认为我应该能够编写一个类似的识别器,该识别器会导致滚动视图的默认识别器失败,而不是延迟触摸,而是立即将它们发送到选择器视图。因此,如果有人知道如何编写这样的识别器,请告诉我,如果您对问题有任何其他解决方案,也非常欢迎您分享。

感谢您阅读整个问题,即使您不知道答案,您仍然可以对问题进行投票,以便它得到更多关注(希望来自能够回答它的人)。谢谢! :)


有时你必须先提出问题才能找到答案。丹·雷(Dan Ray)也遇到了类似的问题,并用一种​​非常不同的解决方案解决了它。

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView* result = [super hitTest:point withEvent:event];

    if ([result.superview isKindOfClass:[UIPickerView class]])
    {
        self.scrollEnabled = NO;
    }
    else 
    {
        self.scrollEnabled = YES;    
    }
    return result;
}

我已经测试了代码,它对我来说也很好用。然而,这并不是真正从滚动视图中窃取触摸,所以如果有人知道如何真正窃取触摸,那就太好了。

Source: UITableView.tableFooterView 内的 UIPickerView 不接收拖动触摸 https://stackoverflow.com/questions/4609239/uipickerview-inside-uitableview-tablefooterview-doesnt-receive-drag-touches

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 UIScrollView 窃取触摸? 的相关文章

随机推荐

  • 非泛型类是否可以包含 .NET(C# 或 VB.NET)中的泛型列表?

    我希望有人可以帮助我理解这样的事情是否可能 如何可能 在这种情况下 假设您正在尝试对电子表格或数据库中的网格进行建模 但每列中的数据只能是一种数据类型 示例 第 1 列只能包含整数 我创建了一个通用类来模拟列结构 如下所示 public c
  • 为什么“C”中的索引从零开始?

    为什么 C 中数组的索引从 0 开始 而不是从 1 开始 在C中 数组的名称本质上是一个指针 但请看评论 对内存位置的引用 等等表达式array n 指的是一个内存位置n远离起始元素的元素 这意味着索引被用作偏移量 数组的第一个元素恰好包含
  • 在不使用会话上下文的情况下在 Web 应用程序中保留值

    我有一个 变量 用户可以在 JSP Struts 应用程序中修改该变量 该变量必须在整个 Web 应用程序的会话中保留 他们可能会离开设置和查看该变量的页面 仍然留在应用程序中 并且当他们回来时 他们上次为该变量设置的值应该仍然存在 显而易
  • iOS7-UItableViewCell 以 Grouped 样式显示在表格视图中

    在 iOS7 中 分组表视图的单元格显示为表视图的全宽 更像是普通表视图样式 但在模拟器的设置应用程序中 分组样式看起来不同 对于实现这种类型的单元有什么帮助吗 该解决方案适用于 iOS7 以及以前版本的 iOS 创建自定义 UITable
  • 是否有正则表达式可以返回相同字符的重复匹配?

    使用 NET 正则表达式 假设我有以下文本 哒哒哒哒哒哒 我想测试任何字符的重复次数是否超过 2 次 正则表达式不应返回包含双字母 例如单词 的文本的匹配项 look UPDATE 不要假设输入文本仅包含字母 d 的重复 我想要任何重复的字
  • 使用 dplyr 和 lazyeval 进行编程

    我在以保留非标准评估的方式重构 dplyr 时遇到问题 假设我想创建一个始终选择和重命名的函数 library lazyeval library dplyr df lt data frame a c 1 2 3 f c 4 5 6 lm c
  • if 语句过多

    我有一些话题要讨论 我有一段代码 24ifs elifs Operation是我自己的类 代表的功能类似于Enum https docs python org 3 library enum html 这是代码片段 if operation
  • Android:调用 onStop() 时“java.lang.IllegalArgumentException:服务未注册”

    我有一个需要长时间运行的应用程序Service 我需要确保当用户离开时Activity the Service stops 因此我实施了onStop 关闭服务 这是代码 Override protected void onStop supe
  • ButterKnife 中 R2.java 中的最后一个字段

    这是一个扩展Android 为什么我们需要使用 R2 而不是 R 和 butterknife https stackoverflow com questions 42362062 android why do we need to use
  • C++ 二进制转十进制

    所以我知道有一种方法可以使用 bitset 库将 Dec 转换为二进制 但是您可以使用 bitset 库将二进制转换为十进制吗 或者你必须手动完成 bitset lt 8 gt bin x number 可以 但它应该是一个字符串 std
  • 在线程中创建的 DatabaseWrapper 对象只能在同一线程中使用。”当尝试使用 celery 插入数据库时

    我正在使用 celery 从 csv 读取数据并将其上传到 Postgres celery 任务正在工作 我认为 但是 django 抛出错误 我正在获取一个文件 将其转换为 pandas 删除 2 列 然后转换为 numpy 并传递给 c
  • 无法将图像上传到 Django 项目,获取 Form 对象没有属性“保存”

    我正在尝试通过模板输入的文件上传图像文件 我已遵循所有说明 但在附加文件并单击提交时出现此错误 AttributeError PicUpForm object has no attribute save 因此我的图像没有上传到指定的目录 并
  • iPad/iPhone双击问题

    我有一个非常相似的问题iPad iPhone 悬停问题导致用户双击链接 https stackoverflow com questions 3038898 ipad iphone hover problem causes the user
  • solr tomcat UTF-8

    我在 tomcat 中有一个 solr 设置 并且使用 jdbc 从数据库导入数据 但是当我在导入数据后使用非 unicode 字符时 发送查询时它无法识别结果中的查询 对于带有 solr 的 Tomcat 的 UTF 8 支持 您可能需要
  • Spring Web 应用程序中配置文件的处理

    我曾多次遇到同样的问题 我想了解其他人对这个问题的看法 假设我们将 Spring 应用程序打包为 war文件 我们想运行它几种环境 开发 测试 预生产 生产 等 为了访问应用程序所需的基础设施 数据库 网络服务等 我们将访问信息存储在配置文
  • 在 C# 中将 Httpheader 添加到 selenium chrome webdriver

    我的 C 代码看起来像这样 用于创建 chrome Web 驱动程序 我想将自定义 HTTP 标头添加到我的所有 http 请求中 例如 用户代理 Android var service ChromeDriverService Create
  • jQuery 删除所有元素,直到找到 id='whatever'

    需要删除从开始标签到下一个标签的所有代码 我试过这个 page1 remove 但这只会删除标签之间的内容 我不知道 page1 和 page2 标记之间还有什么 因为代码是根据页面上表单元素的类型动态添加的 div div div div
  • nmap 和 print(nm.csv()) 需要帮助打印到 csv.file

    我需要您帮助处理 nmap 脚本并将输出打印到 csv 文件 当我运行脚本并完成它时print nm csv 我得到了以下显示的结果 这是我想要的第一名 host hostname hostname type protocol port n
  • Fat Free Framework (F3):自定义 404 页面(和其他错误)

    如何处理 404 自定义页面 以及可能的其他错误 我只是尝试在路由部分添加 GET codes WebController gt error 我的 Class WebController 处理错误的地方 对于 404 我解决了 部分 实际上
  • 如何从 UIScrollView 窃取触摸?

    今天 在我的创作时间里 我做了一些相当全面的研究 了解如何从 UIScrollView 窃取触摸并将它们立即发送到特定的子视图 同时保持滚动视图其余部分的默认行为 考虑在 UITableView 中包含 UIPickerView 默认行为是