我想要实现一个动作,当我按住该按钮时,它会开始重复执行一个动作(类似于桌面UI上的滚动按钮)。在UIGestureRecognizer / events框架中是否对此有一流的支持,还是我只是自己动手?
例如
var timer:Timer?
func killDing() {
self.timer?.invalidate()
self.timer = nil
}
func startDing() {
self.killTimer()
self.timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) {
self.ding() // this is where the repeated code happens
}
}
override func beginTracking(_ touch:UITouch, with event:UIEvent?) -> Bool {
self.startDing()
}
override func endTracking(_ touch: UITouch?, with event: UIEvent?) {
super.endTracking(touch, with: event)
self.killDing()
}
我当然也可以使用LongPressGestureRecognizer进行此操作。我的问题是,是否需要像上面所示那样滚动自己的ding循环,或者UIKit中是否还有一些我目前不知道并且应该利用的头等舱。
答案 0 :(得分:0)
我认为您的做法正确。您可以使用使用计时器重复执行某些操作,但是您应该add the created timer进入具有common
模式的运行循环,如果没有此模式,则运行循环将不会在以下情况下调用计时器的动作用户正在触摸屏幕
let timer = Timer(timerInterval: interval, repeats: true, block: block)
RunLoop.current.add(timer, forMode: . common)
您还可以使用CADisplayLink
来调用您的操作。您可以在my library中找到使用CADisplayLink的示例,它可以帮助您实现基于CADisplayLink的动画:
let link = CADisplayLink(target: self, selector: #selector(updateAction(sender:)));
link.add(to: RunLoop.main, forMode: .commonModes);