自定义 activity 指标的基于计时器的动画的更好替代方案?
Better alternative to timer based animation for custom activity indicator?
我有一个显示自定义不确定进度指示器的 class。每个计时器更新它只是使用 CGAffineTransformRotate 增加 UIImageView 的旋转。
一切正常,但是,我注意到当它是 运行 时,它正在等待的后台进程运行速度慢了 50% - 这是一个巨大的损失。例如;而不是花 20 秒来完成处理,它需要 30 秒。有人可以推荐一种性能损失较小的解决方案吗?
func show() {
timer?.invalidate()
timer = NSTimer.scheduledTimerWithTimeInterval(0.03, target: self, selector: #selector(self.updateTimer(_:)), userInfo: nil, repeats: true)
}
func updateTimer(sender: NSTimer) {
iconView.transform = CGAffineTransformRotate(iconView.transform, 0.15)
}
我认为你可以使用@Rob 的回答中的dispatch_source:
Do something every x minutes in Swift
代码如下:
var timer: dispatch_source_t!
func startTimer() {
let queue = dispatch_queue_create("com.domain.app.timer", nil)
timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue)
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 60 * NSEC_PER_SEC, 1 * NSEC_PER_SEC) // every 60 seconds, with leeway of 1 second
dispatch_source_set_event_handler(timer) {
// do whatever you want here
}
dispatch_resume(timer)
}
func stopTimer() {
dispatch_source_cancel(timer)
timer = nil
}
使用 Core Animation 为旋转设置动画。 window 服务器将在您的应用进程之外完成所有工作。
let animation = CABasicAnimation(keyPath: "transform.rotation")
animation.fromValue = 0
animation.toValue = 2 * M_PI
animation.repeatCount = .infinity
animation.duration = 1.25
iconView.layer.addAnimation(animation, forKey: animation.keyPath)
我有一个显示自定义不确定进度指示器的 class。每个计时器更新它只是使用 CGAffineTransformRotate 增加 UIImageView 的旋转。
一切正常,但是,我注意到当它是 运行 时,它正在等待的后台进程运行速度慢了 50% - 这是一个巨大的损失。例如;而不是花 20 秒来完成处理,它需要 30 秒。有人可以推荐一种性能损失较小的解决方案吗?
func show() {
timer?.invalidate()
timer = NSTimer.scheduledTimerWithTimeInterval(0.03, target: self, selector: #selector(self.updateTimer(_:)), userInfo: nil, repeats: true)
}
func updateTimer(sender: NSTimer) {
iconView.transform = CGAffineTransformRotate(iconView.transform, 0.15)
}
我认为你可以使用@Rob 的回答中的dispatch_source:
Do something every x minutes in Swift
代码如下:
var timer: dispatch_source_t!
func startTimer() {
let queue = dispatch_queue_create("com.domain.app.timer", nil)
timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue)
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 60 * NSEC_PER_SEC, 1 * NSEC_PER_SEC) // every 60 seconds, with leeway of 1 second
dispatch_source_set_event_handler(timer) {
// do whatever you want here
}
dispatch_resume(timer)
}
func stopTimer() {
dispatch_source_cancel(timer)
timer = nil
}
使用 Core Animation 为旋转设置动画。 window 服务器将在您的应用进程之外完成所有工作。
let animation = CABasicAnimation(keyPath: "transform.rotation")
animation.fromValue = 0
animation.toValue = 2 * M_PI
animation.repeatCount = .infinity
animation.duration = 1.25
iconView.layer.addAnimation(animation, forKey: animation.keyPath)