【发布时间】:2017-08-09 17:55:26
【问题描述】:
我有一个名为View 的UIView 子类,我希望在其中有一个“波纹”从用户双击的位置向外移动(以及执行其他绘图功能)。这是我的draw方法的相关部分,目前:
override func draw(_ rect: CGRect) {
for r in ripples {
r.paint()
}
}
这就是r.paint() 的实现方式,在Ripple 类中:
func paint() {
let c = UIColor(white: CGFloat(1.0 - (Float(iter))/100), alpha: CGFloat(1))
print(iter, " - ",Float(iter)/100)
c.setFill()
view.fillCircle(center: CGPoint(x:x,y:y), radius: CGFloat(iter))
}
iter 应该每 0.1 秒递增一个 Timer,它在 Ripple 的构造函数中启动:
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: move)
move实现如下:
func move(_ timer: Timer) {
while (tier<100) {
iter += 1
DispatchQueue.main.async {
self.view.setNeedsDisplay()
}
}
timer.invalidate()
}
应该发生的是,当计时器触发时,每 0.1 秒,它会增加 iter 并告诉 View 重新绘制,然后它将使用 Ripple.paint() 方法来完成,该方法使用 iter确定圆的颜色和半径。
但是,正如使用 print 语句所揭示的那样,所发生的情况是 Timer 在重绘实际发生之前全部触发了 100 次。我尝试通过用DispatchQueue.main.sync 替换DispatchQueue.main.async 来解决这个问题,但这只是让应用程序挂起。我究竟做错了什么?如果这不是解决问题的正确方法,我如何才能在应用程序仍然执行其他功能(例如产生更多涟漪)的同时获得平滑的涟漪动画(其中涉及一个在改变颜色的同时增长的圆圈)? (这意味着多个涟漪需要能够同时工作。)
【问题讨论】:
标签: ios uiview timer uikit core-graphics