我注意到自测试版5以来在OS X 10.10下隐式动画的一些奇怪行为。 调用动画代理有时会导致应用程序崩溃。我设置了一个非常简单的自定义视图。这是完整的代码:
import Cocoa
import QuartzCore
class AnimatedView: NSView {
var firstColor: NSColor = NSColor.blackColor() {
didSet {
self.needsDisplay = true
}
}
var secondColor: NSColor = NSColor.whiteColor() {
didSet {
self.needsDisplay = true
}
}
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
let outerRect = self.bounds
let halfW = outerRect.width / 4.0
let halfH = outerRect.height / 4.0
var innerRect = outerRect
innerRect.inset(dx: halfW, dy: halfH)
self.firstColor.set()
NSRectFill(outerRect)
self.secondColor.set()
NSRectFill(innerRect)
}
override func animationForKey(key: String!) -> AnyObject! {
switch key {
case "firstColor", "secondColor" :
return CABasicAnimation()
default :
return super.animationForKey(key)
}
}
}
如果我尝试动画NSView的ans祖先的属性,一切都像魅力一样。如:
animView.animator().frame = someFrame
如果我尝试为AnimatedView的属性设置动画,例如firstColor或secondColor:
animView.animator().firstColor = someColor
animView.animator().secondColor = someOtherColor
它崩溃了各种错误代码(尝试之间的代码没有变化):
没有对象是Nil(我已经检查了两次)。
有时会抱怨__CFString,有时它会在没有代码更改的情况下崩溃,但它永远不会有效......
我认为这是某种错误,但我必须在报告之前确定,或许我忘了一些。
答案 0 :(得分:9)
重新阅读发行说明,注意到动态关键字,测试它,有效! 因此,如果要为自定义属性设置动画,则必须在属性声明中使用动态关键字:
dynamic var firstColor: NSColor = NSColor.blackColor() {
didSet {
self.needsDisplay = true
}
}
dynamic var secondColor: NSColor = NSColor.whiteColor() {
didSet {
self.needsDisplay = true
}
}
我不知道为什么它在测试版5之前有用,我不知道它是否是一个临时的解决方法,或者它是正常方式使用它但它的工作原理很好