找出按下了哪个按钮,同时长按和点击之间存在差异。 swift
figure out which button was pressed while differ between long-press and tap. swift
所以我有长按和短按按钮的监听器,但我需要知道按下了哪个按钮。
是否可以找出在 tap 和 long 函数中按下了什么按钮,还是我需要为每个按钮执行两个函数?
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tap))
let longGesture = UILongPressGestureRecognizer(target: self, action: #selector(long))
longGesture.minimumPressDuration = 0.5
smallOption.addGestureRecognizer(tapGesture)
mediumOption.addGestureRecognizer(tapGesture)
largeOption.addGestureRecognizer(tapGesture)
smallOption.addGestureRecognizer(longGesture)
mediumOption.addGestureRecognizer(longGesture)
largeOption.addGestureRecognizer(longGesture)
@objc func tap(_ sender: UIGestureRecognizer){
print("short-press")
}
@objc func long(_ sender: UIGestureRecognizer){
print("long-press")
}
您不需要为每个按钮的相同手势使用两个函数。更改方法定义以接受 UIButton
(在您的情况下)而不是 UIGestureRecognizer
。然后,直接通过验证标签或类型来检查发件人...
@objc func tap(_ sender: UIButton){
switch sender {
case button1: // or by tags of buttons
case button2:
...
default: break
}
在这种情况下,主要问题是 仅 为 largeOption
按钮添加两种手势!澄清一下,仅为一个组件添加手势,在您的情况下,应该仅为最新的组件添加手势(即 largeOption
):
smallOption.addGestureRecognizer(tapGesture) <-- skipped
mediumOption.addGestureRecognizer(tapGesture) <-- skipped
largeOption.addGestureRecognizer(tapGesture) <-- added
smallOption.addGestureRecognizer(longGesture) <-- skipped
mediumOption.addGestureRecognizer(longGesture) <-- skipped
largeOption.addGestureRecognizer(longGesture) <-- added
从逻辑上讲,这可能是您问题的答案:
Is it possible to find out what button was pressed in the tap and long function, or will I need to do two functions for each button?
您需要为每个按钮添加两个手势,因为一个特定的手势只能添加到一个视图。
但是,除了 @objc func tap(_ sender: UIGestureRecognizer)
和 @objc func long(_ sender: UIGestureRecognizer)
现有方法之外,您不必声明新的操作方法。您可以改为检查 sender
的视图。示例:
假设我们为每个按钮手动添加了拖曳手势:
// gestures:
let smallOptionTapGesture = UITapGestureRecognizer(target: self, action: #selector(tap))
let smallOptionLongGesture = UILongPressGestureRecognizer(target: self, action: #selector(long))
smallOptionLongGesture.minimumPressDuration = 0.5
let mediumOptionTapGesture = UITapGestureRecognizer(target: self, action: #selector(tap))
let mediumOptionLongGesture = UILongPressGestureRecognizer(target: self, action: #selector(long))
mediumOptionLongGesture.minimumPressDuration = 0.5
let largeOptionTapGesture = UITapGestureRecognizer(target: self, action: #selector(tap))
let largeOptionLongGesture = UILongPressGestureRecognizer(target: self, action: #selector(long))
largeOptionLongGesture.minimumPressDuration = 0.5
// adding them:
smallOption.addGestureRecognizer(smallOptionTapGesture)
mediumOption.addGestureRecognizer(mediumOptionTapGesture)
largeOption.addGestureRecognizer(largeOptionTapGesture)
smallOption.addGestureRecognizer(smallOptionLongGesture)
mediumOption.addGestureRecognizer(mediumOptionLongGesture)
largeOption.addGestureRecognizer(largeOptionLongGesture)
因此,您可以做的是:
@objc func tap(_ sender: UIGestureRecognizer) {
// an example of how you could check the button
if sender.view == smallOption {
print("small short-press")
} else if sender.view == mediumOption {
print("medium short-press")
} else if sender.view == largeOption {
print("large short-press")
}
}
@objc func long(_ sender: UIGestureRecognizer) {
// you could apply the same above approach here
}
另一种选择是分别为每个按钮创建操作方法。
所以我有长按和短按按钮的监听器,但我需要知道按下了哪个按钮。 是否可以找出在 tap 和 long 函数中按下了什么按钮,还是我需要为每个按钮执行两个函数?
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tap))
let longGesture = UILongPressGestureRecognizer(target: self, action: #selector(long))
longGesture.minimumPressDuration = 0.5
smallOption.addGestureRecognizer(tapGesture)
mediumOption.addGestureRecognizer(tapGesture)
largeOption.addGestureRecognizer(tapGesture)
smallOption.addGestureRecognizer(longGesture)
mediumOption.addGestureRecognizer(longGesture)
largeOption.addGestureRecognizer(longGesture)
@objc func tap(_ sender: UIGestureRecognizer){
print("short-press")
}
@objc func long(_ sender: UIGestureRecognizer){
print("long-press")
}
您不需要为每个按钮的相同手势使用两个函数。更改方法定义以接受 UIButton
(在您的情况下)而不是 UIGestureRecognizer
。然后,直接通过验证标签或类型来检查发件人...
@objc func tap(_ sender: UIButton){
switch sender {
case button1: // or by tags of buttons
case button2:
...
default: break
}
在这种情况下,主要问题是 仅 为 largeOption
按钮添加两种手势!澄清一下,仅为一个组件添加手势,在您的情况下,应该仅为最新的组件添加手势(即 largeOption
):
smallOption.addGestureRecognizer(tapGesture) <-- skipped
mediumOption.addGestureRecognizer(tapGesture) <-- skipped
largeOption.addGestureRecognizer(tapGesture) <-- added
smallOption.addGestureRecognizer(longGesture) <-- skipped
mediumOption.addGestureRecognizer(longGesture) <-- skipped
largeOption.addGestureRecognizer(longGesture) <-- added
从逻辑上讲,这可能是您问题的答案:
Is it possible to find out what button was pressed in the tap and long function, or will I need to do two functions for each button?
您需要为每个按钮添加两个手势,因为一个特定的手势只能添加到一个视图。
但是,除了 @objc func tap(_ sender: UIGestureRecognizer)
和 @objc func long(_ sender: UIGestureRecognizer)
现有方法之外,您不必声明新的操作方法。您可以改为检查 sender
的视图。示例:
假设我们为每个按钮手动添加了拖曳手势:
// gestures:
let smallOptionTapGesture = UITapGestureRecognizer(target: self, action: #selector(tap))
let smallOptionLongGesture = UILongPressGestureRecognizer(target: self, action: #selector(long))
smallOptionLongGesture.minimumPressDuration = 0.5
let mediumOptionTapGesture = UITapGestureRecognizer(target: self, action: #selector(tap))
let mediumOptionLongGesture = UILongPressGestureRecognizer(target: self, action: #selector(long))
mediumOptionLongGesture.minimumPressDuration = 0.5
let largeOptionTapGesture = UITapGestureRecognizer(target: self, action: #selector(tap))
let largeOptionLongGesture = UILongPressGestureRecognizer(target: self, action: #selector(long))
largeOptionLongGesture.minimumPressDuration = 0.5
// adding them:
smallOption.addGestureRecognizer(smallOptionTapGesture)
mediumOption.addGestureRecognizer(mediumOptionTapGesture)
largeOption.addGestureRecognizer(largeOptionTapGesture)
smallOption.addGestureRecognizer(smallOptionLongGesture)
mediumOption.addGestureRecognizer(mediumOptionLongGesture)
largeOption.addGestureRecognizer(largeOptionLongGesture)
因此,您可以做的是:
@objc func tap(_ sender: UIGestureRecognizer) {
// an example of how you could check the button
if sender.view == smallOption {
print("small short-press")
} else if sender.view == mediumOption {
print("medium short-press")
} else if sender.view == largeOption {
print("large short-press")
}
}
@objc func long(_ sender: UIGestureRecognizer) {
// you could apply the same above approach here
}
另一种选择是分别为每个按钮创建操作方法。