UITapGestureRecognizer 和 addTarget 的区别

Posted

技术标签:

【中文标题】UITapGestureRecognizer 和 addTarget 的区别【英文标题】:Difference between UITapGestureRecognizer and addTarget 【发布时间】:2016-08-24 13:25:35 【问题描述】:

谁能澄清这两种在点击视图时触发功能的方式之间的区别?

1) myView.addTarget(self, action: #selector(myFunctionToTrigger(_:)), forControlEvents: UIControlEvents.TouchUpInside)

2) let tapGesture = UITapGestureRecognizer(target: self, action: #selector(myFunctionToTrigger(_:))) myView.addGestureRecognizer(tapGesture)

【问题讨论】:

相同的 tapGesture 可以重复使用并分配给其他视图 :) 但这当然不是答案 这是唯一的区别吗?它们都可以应用于任何UIView吗? 【参考方案1】:

这是在 ios 应用中实现用户事件处理的两种完全不同的方式。

1)。 addTarget() - 是 UIControl 类的方法,它是目标动作机制的一部分。在documentation 中了解更多信息。

您不能将addTarget 包含在任何UIView 中,只能到UIControl 子类。

2)。 UIGestureRecognizer 子类只是一种简单的机制来检测和区分特定视图上的用户手势。

它们之间的主要区别在于手势识别器可以检测更复杂的事件,例如滑动或捏合或缩放,但-addTarget 是一种更有效的检测用户活动的方法,它还为所有UIControl 提供相同级别的界面如UISegmetedControlUISlider等。

希望对你有所帮助。

【讨论】:

【参考方案2】:

这两种方法在两个不同的抽象级别上工作:

addTarget:action:forControlEvents 是提供隔离事件的较低级别。必须组合和解释其中的几个事件,以检测更复杂的手势,例如滑动或捏合。 addGestureRecognizer 在更接近应用程序通常需要的更高级别上工作。它添加了特定的手势识别器,用于侦听低级事件、检测手势并提供有关手势的特定信息。

在点击的情况下,差异很小。但是当涉及到滑动、捏合以及轻击、滑动、捏合的组合(例如在图像查看器或地图应用程序中)时,一个或多个手势识别器是可行的方法。

【讨论】:

【参考方案3】:

这就是区别

对于UITapGestureRecognizer,您可以为指定的手势添加事件,例如 UITapGestureRecognizer、UIPanGestureRecognizer... 和许多其他手势。

对于UIView addTarget(),您可以为指定事件添加目标,例如UIControlEvents.TouchUpInside.. 和许多其他事件。

【讨论】:

【参考方案4】:

Pavel 的回答是正确的,您只能将目标添加到 UIControlView,它是 UIView 的子类。 UIGestureRecognizer 可以添加到任何 UIView。

Codo 的回答是目标比手势低级别是错误的,手势是较低级别的触摸支持。 UIControl 使用手势使 addTarget:action:forControlEvents 工作。

【讨论】:

【参考方案5】:

addTarget 有几个好处:

    这是一个内置函数。你不需要初始化另一个对象来做同样的事情。 您可以设置对操作做出反应的时间:“touchUpInside”或“touchDown”(或滑块的“valueChanged”)。 您可以设置按钮的不同外观(例如标题文本、标题颜色、内容图像、背景图像、突出显示色调),并且仅在使用 addTarget 时按钮才显示这些状态。

除了上面的好处之外,我认为它更像是 UIControl 元素的编码约定。

【讨论】:

以上是关于UITapGestureRecognizer 和 addTarget 的区别的主要内容,如果未能解决你的问题,请参考以下文章

UITapGestureRecognizer 和 touchesBegan 用于相同的视图

UIWebView 上的 UIScrollView 和 UITapGestureRecognizer 冲突

UITapGestureRecognizer 和自动校正

UITapGestureRecognizer 和 addTarget 的区别

NSString 和 UITapGestureRecognizer 作为方法参数

UILongPressGestureRecognizer 和 UITapGestureRecognizer