ios - 通过 UILabel 使用多个轻击手势
问题描述
我正在创建一个UILabel
需要两个手势,单击和双击。
class ViewController: UIViewController, UIGestureRecognizerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(labelView)
labelView.topAnchor.constraint(equalTo: view.topAnchor),
quoteLabelView.leadingAnchor.constraint(equalTo:
view.leadingAnchor),
quoteLabelView.trailingAnchor.constraint(equalTo:
view.trailingAnchor),
quoteLabelView.bottomAnchor.constraint(equalTo:
view.topAnchor),
}
var labelView: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.isUserInteractionEnabled = true
let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleSingleTap))
let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap))
singleTapGesture.numberOfTapsRequired = 1
doubleTapGesture.numberOfTapsRequired = 2
label.addGestureRecognizer(singleTapGesture)
label.addGestureRecognizer(doubleTapGesture)
return label
}()
}
我阅读了苹果文档,其中提供了有关偏好一种手势而不是另一种手势的信息,但我不知道如何将其应用于标签。 https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/coordinating_multiple_gesture_recognizers/preferring_one_gesture_over_another
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
// Don't recognize a single tap until a double-tap fails.
if gestureRecognizer == self.tapGesture &&
otherGestureRecognizer == self.doubleTapGesture {
return true
}
return false
}
有任何想法吗?
解决方案
如果你想在你的标签声明中添加你的手势识别器,你最好使用单独的函数来进行单击和双击:
class TestViewController: UIViewController {
lazy var labelView: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.isUserInteractionEnabled = true
let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(didSingleTap(_:)))
singleTapGesture.numberOfTapsRequired = 1
label.addGestureRecognizer(singleTapGesture)
let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(didDoubleTap(_:)))
doubleTapGesture.numberOfTapsRequired = 2
label.addGestureRecognizer(doubleTapGesture)
singleTapGesture.require(toFail: doubleTapGesture)
return label
}()
override func viewDidLoad() {
super.viewDidLoad()
// add the labelView
view.addSubview(labelView)
// set a couple properties
labelView.text = "Tap or Double-Tap Me"
labelView.textAlignment = .center
labelView.backgroundColor = .yellow
// constrain it to the view
NSLayoutConstraint.activate([
labelView.topAnchor.constraint(equalTo: view.topAnchor, constant: 200),
labelView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
labelView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
])
}
@objc func didSingleTap(_ gesture: UITapGestureRecognizer) -> Void {
print("Did Single Tap")
}
@objc func didDoubleTap(_ gesture: UITapGestureRecognizer) -> Void {
print("Did Double Tap")
}
}
推荐阅读
- javascript - Chrome 是否可以与外部设备通信?
- c# - 如果未找到公共默认构造函数,则 ASP.NET Core 使用非默认构造函数
- arrays - 如何限制数组显示 5 个项目并在按钮上单击加载 5 个
- jquery - 如何使用设备(iOS)中的后退按钮关闭覆盖,而不是在浏览器中?
- reactjs - 抽屉可以是永久性的并覆盖内容吗?
- go - 修复所有给出“go:错误加载模块要求”的 Go 命令?
- replace - 使用变量搜索和替换
- java - 在位置按钮上的edittext中获取并显示用户位置邮政编码点击就像在只是吃应用程序中一样
- sql - SQL Server 子分区
- c# - WCF 何时从 app.config 加载值?