定期触发重绘自定义视图
Periodically trigger redrawing custom view
我正在编写一个计时器应用程序作为我的第一个 Cocoa-应用程序,使用 Swift 和 运行 解决了一个问题。我使用自定义视图来显示剩余时间。它工作正常,但是当我按下其中一个按钮时,重绘停止,直到我松开按钮。我想这与我使用 NSTimer 触发视图绘制的方式有关,这似乎干扰了 运行-loop.
按下开始按钮时,记录当前时间。
startTime = NSDate()
timer = NSTimer.scheduledTimerWithTimeInterval(0.05, target: self,
selector: "update", userInfo: nil, repeats: true)
在更新方法中,经过的时间被计算并存储在 属性 中,它由视图控制器中的 KVO 监视。告诉视图重绘的地方。
timerView.needsDisplay = true
更新视图的正确方法是什么?
您只需将计时器添加到 mainRunLoop 模式 NSRunLoopCommonModes:
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
当您按下按钮时,会出现一个动画,停止主线程上的所有其他 animations/drawings。
你为什么不 运行 你的计时器在后台线程上异步,这样它就不会受到主线程交互的影响。
看看NSOperation
我正在编写一个计时器应用程序作为我的第一个 Cocoa-应用程序,使用 Swift 和 运行 解决了一个问题。我使用自定义视图来显示剩余时间。它工作正常,但是当我按下其中一个按钮时,重绘停止,直到我松开按钮。我想这与我使用 NSTimer 触发视图绘制的方式有关,这似乎干扰了 运行-loop.
按下开始按钮时,记录当前时间。
startTime = NSDate()
timer = NSTimer.scheduledTimerWithTimeInterval(0.05, target: self,
selector: "update", userInfo: nil, repeats: true)
在更新方法中,经过的时间被计算并存储在 属性 中,它由视图控制器中的 KVO 监视。告诉视图重绘的地方。
timerView.needsDisplay = true
更新视图的正确方法是什么?
您只需将计时器添加到 mainRunLoop 模式 NSRunLoopCommonModes:
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
当您按下按钮时,会出现一个动画,停止主线程上的所有其他 animations/drawings。
你为什么不 运行 你的计时器在后台线程上异步,这样它就不会受到主线程交互的影响。
看看NSOperation