如何以编程方式触发 UIView 的点击手势识别器

Posted

技术标签:

【中文标题】如何以编程方式触发 UIView 的点击手势识别器【英文标题】:How to trigger tap gesture recognizer of UIView programmatically 【发布时间】:2016-08-30 06:26:35 【问题描述】:

我想将点击gesture 识别器附加到UIView 并以编程方式触发它。我成功地找到了一种方法来找到UIView 的点击手势识别器。但现在我不知道如何以编程方式触发它。我正在开发应用程序crawler。因此,如果我有一个 ViewController 的源代码,我的爬虫将开始爬取找到ViewController 的所有subviews。此外,爬虫将找到附加到subviewsgesture。并触发点击gesture

注意:我知道如何将手势识别器附加到UIView 并触发它。但就我而言,我想自动化应用程序的点击过程。考虑一下,因为我想在运行时找到UIView 的点击手势识别器并触发它。

【问题讨论】:

如果您希望它以编程方式工作,那么为什么需要手势?只调用您的方法。 点击手势总是由用户触发。为什么需要以编程方式触发。 我正在开发应用程序爬虫。所以爬虫会点击任何点击手势识别器。 您的问题不清楚,请深入解释。 显示你的代码到现在你尝试了什么 【参考方案1】:

我通过创建假触摸解决了这个问题。无法触发手势,因为手势不会暴露其动作和选择器。但正如我想点击的UIView 一样。我可以在 UIView 上创建一个虚假的触摸。这种假触摸将自动触发轻击手势。 This 链接对此非常有帮助。

【讨论】:

【参考方案2】:

你不能,因为手势没有暴露它的目标和动作。您需要创建一个子类或使用一些私有 API 来访问这些值,以便您可以使用它们。如果您要创建通用的东西,那么子类选项无论如何都不好,但更广泛地说,并非所有东西都适用于手势,因此您的解决方案是不完整的。

我认为大多数测试工具都使用可访问性界面来查找交互式视图并以编程方式点击它们。

【讨论】:

【参考方案3】:

techcraze兄弟一般Gesture Says

手势实际上是发生在屏幕特定区域上的一根或多根手指的触摸和移动,那里存在感兴趣的视图

说到Tap gesture Recognizer

UITapGestureRecognizer: 该类涉及在视图上做出的轻击手势。它可用于用一根或多根手指处理单个或多个水龙头。点击是用户最常用的手势之一。

没有手指帮助你不能自动做兄弟。

所以我们的代码可以使用

- (void)viewDidLoad

  UITapGestureRecognizer *tapgesture =[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapView:)];
  tapgesture.numberOfTouchesRequired=1;
  [self.view addGestureRecognizer:tapgesture];


-(void)tapView:(UITapGestureRecognizer *)gesture

  NSLog(@"The taped tag view is - %ld",gesture.view.tag);

【讨论】:

我认识这位兄弟。我想知道的是,当用户点击屏幕时,一定有某种方法可以识别点击并触发某种方法。我想知道 CocoTouch 使用了哪种方法,以便找到被点击的视图并触发手势。 兄弟,当您点击查看时,tapView:方法会自动调用。请参阅操作:@selector(tapView:)。在您的 tapView 方法中放置断点。点击视图时它会调用。 是的。但是,如果您不知道它所附加的操作怎么办?在我的情况下,我将只有视图的姿态。从手势我必须找到它的动作或任何方式来触发而不找到它的动作。我认为@Wain 的回答是有道理的,手势不会暴露其目标和动作。 恭喜兄弟:-) 你是怎么做到的?

以上是关于如何以编程方式触发 UIView 的点击手势识别器的主要内容,如果未能解决你的问题,请参考以下文章

可以使用自定义 UIViewController 但没有自定义 UIView 类来实现手势识别吗?

自定义 UITableViewCell:以编程方式触发选择 segue

以编程方式制作的按钮与 viewController 的手势识别器冲突

在 UIView.animateWithDuration() 期间启用手势识别器的用户交互

点击自定义 UIView 会触发错误的选择器

以编程方式将点击手势添加到 UILabel