ios - iOS/UIKit 是否内置了对 dinging 之类的调度滚动的支持

标签 ios swift uikit

我想实现一个 Action ,当我按住时开始重复执行一个 Action (类似于桌面用户界面上的滚动按钮)。 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 中是否有我目前不知道但应该利用的更多一流内容。

最佳答案

我认为您的方法是正确的。您可以使用计时器来重复某些操作,但您应该 add the created timer进入带有 common 的运行循环模式,如果没有这种模式,运行循环将不会在用户触摸屏幕时调用定时器的 Action

let timer = Timer(timerInterval: interval, repeats: true, block: block) 
RunLoop.current.add(timer, forMode: . common)

您也可以使用 CADisplayLink , 调用你的 Action 。您可以在 my library 中找到使用 CADisplayLink 的示例, 女巫可以帮助您实现基于 CADisplayLink 的动画:

let link = CADisplayLink(target: self, selector: #selector(updateAction(sender:)));
link.add(to: RunLoop.main, forMode: .commonModes);

关于ios - iOS/UIKit 是否内置了对 dinging 之类的调度滚动的支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53714816/

相关文章:

swift - 使用 SwiftUI 的 Environment 传递标准类型(Int、String 等)来查看层次结构

swift - 如何在 Swift 中使用 Core Animation 制作链式动画?

iphone - 为 iPhone 本地化带有文本的图像的最佳方法是什么?

ios - Swift "Scanner"陷入死循环

ios - Swift 正确对齐以编程方式创建的 UIBarButtonItem

ios - 如何在我的 ios 应用程序中为帮助页面添加此格式化文本

ios - 添加约束时出错

iphone - iOS MapKit userLocation 在第一次调用时返回零,但是

swift - 有未知的类消息,代码将无法连接到我构建的类

swift - 如何使 didSelectRowAt IndexPath 与自定义委托(delegate)一起工作