【发布时间】:2016-02-27 22:44:33
【问题描述】:
我正在尝试使用 NTTimer,但它不起作用。
从这里开始:
timer = NSTimer.scheduledTimerWithTimeInterval(0.003, target: self, selector: "openFrameAnimation", userInfo: nil, repeats: true)
它触发这个函数:
func openFrameAnimation(){
Swift.print("Animation Goes... ",NSDate().timeIntervalSince1970)
self.frame = NSRect(x: self.frame.origin.x,
y: self.frame.origin.y-12,
width: self.frame.width,
height: self.frame.height + 12)
if(self.frame.height >= self.finalFrame.height){
Swift.print("STOP")
self.frame = self.finalFrame
timer.invalidate()
// timer = nil //ERROR: nil cannot be assigned to type "NSTimer"
}
self.needsDisplay = true
}
即使一遍又一遍地打印“STOP”,计时器继续调用openFrameAnimation,我无法停止它。验证条件后如何停止计时器?
日志:
[...]
*Animation Goes... 1456613095.27813
STOP
[...]
Animation Goes... 1456613095.51233
STOP
Animation Goes... 1456613095.54458
[...]
STOP
Animation Goes... 1456613095.5938
STOP*
【问题讨论】:
-
您展示的内容应该有效。您需要提供更多背景信息。启动计时器的代码在哪里? (在什么方法中)显示包含方法,并告诉我们它是如何调用的。定时器在哪里定义?我的猜测是您创建了多个计时器,然后“计时器”变量中仅引用了最后一个创建的计时器。
-
您应该重写您的计时器方法 openFrameAnimation 以将 NSTimer 作为参数(触发调用该方法的计时器。)这是计时器方法的正常方法签名。然后,您可以记录计时器以查看发生了什么。
-
我建议对动画使用
CADisplayLink而不是NSTimer。它是动画的最佳时机(出于动画目的,在尽可能早的时间触发)。有关此主题的讨论,请参阅developer.apple.com/videos/wwdc/2014/?id=236(大约 14 分钟)。 FWIW,即使您一直使用NSTimer,也没有必要每 0.003 秒运行一次计时器,因为最大帧速率为 60 fps,即大约每 0.01667 秒。此外,关于将计时器变量设置为nil,您可以将其设为可选,您可以将其设置为nil并释放旧计时器。