我注意到自测试版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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试动画NSView的ans祖先的属性,一切都像魅力一样.如 :
animView.animator().frame = someFrame
Run Code Online (Sandbox Code Playgroud)
如果我尝试动画AnimatedView的属性,例如firstColor或secondColor:
animView.animator().firstColor = someColor
animView.animator().secondColor = someOtherColor
Run Code Online (Sandbox Code Playgroud)
它崩溃了各种错误代码(尝试之间的代码没有变化):
没有对象是Nil(我已经检查了两次).
有时它会抱怨__CFString,有时它只会在没有代码更改的情况下崩溃,但它永远不会起作用......
我认为这是某种错误,但我必须在报告之前确定,或许我忘记了一些事情.
重新阅读发行说明,注意到动态关键字,测试它,有效!因此,如果要为自定义属性设置动画,则必须在属性声明中使用dynamic关键字:
dynamic var firstColor: NSColor = NSColor.blackColor() {
didSet {
self.needsDisplay = true
}
}
dynamic var secondColor: NSColor = NSColor.whiteColor() {
didSet {
self.needsDisplay = true
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道为什么它在测试版5之前有用,我不知道它是否是一个临时的解决方法,或者它是否是正常的使用方法,但它的工作原理很好.
归档时间: |
|
查看次数: |
425 次 |
最近记录: |