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
提供相同级别的界面如UISegmetedControl
、UISlider
等。
希望对你有所帮助。
【讨论】:
【参考方案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 和 addTarget 的区别