我为按钮分配了一个长按手势识别器。
我希望按钮在长按期间保持突出显示(就像在正常单击期间一样),并且在长按之后不触发单击。
到目前为止,我已经尝试过:
为了说明为什么具有此功能可能很重要,让我们以显示数字的UILabel和递增该数字的按钮为例。
单击可将数字增加1,长按则可将数字增加10(稍后可以添加一个计时器,该功能是在按住手指时“自动增加”数字,但出于以下目的)这个例子,我省去了。)
所以我从以下代码开始:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var numberDisplayLabel: UILabel!
@IBOutlet weak var incrementNumberButton: UIButton!
@IBOutlet var buttonLPGR: UILongPressGestureRecognizer!
var numVal = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
numberDisplayLabel.text = String(numVal)
}
@IBAction func buttonClicked(_ sender: UIButton) {
print("button clicked")
numVal += 1
numberDisplayLabel.text = String(numVal)
}
@IBAction func longPressOnButtonRecognized(_ sender: UILongPressGestureRecognizer) {
print("long press recognized, state: \(sender.state.rawValue)")
if (sender.state == .ended) {
numVal += 10
numberDisplayLabel.text = String(numVal)
}
}
}
让我们尝试单击一下,看看是否可行:
是的,是的。
现在让我们看看如果我们长按它会发生什么:
所以...您可以看到,按下按钮时该按钮高亮显示(正常显示),但是当识别出长按时(进入.began状态),该高亮显示被取消。当我们最终释放触摸时,该数字将按预期增加10。
但是,如果我们希望按钮在整个过程中都保持高亮状态...
我们可以尝试将这段代码添加到viewDidLoad():
buttonLPGR.cancelsTouchesInView = false
这应该防止长按识别取消初始触摸。
让我们看看! :
嗯,我们已经达到了突出显示所需的内容,但是现在,由于长按不再取消常规按,因此仍调用按钮的touchUpInside动作功能,因此数字不仅增加了10 ,但也减1。
这是我不知道该怎么做的地方。
那么,再一次:我们如何在长按期间将按钮保持突出显示(就像在正常单击过程中一样),以及长按后不触发单击? >
如果触摸框架提供了一种无需解决方法的方法,则将是首选。