使用绑定能力子类化 NSImageView
Subclassing NSImageView with the binding ability
我正在尝试在 NSImageView 中为图像变化设置动画。这是一个纯学术问题,我在macOS绑定框架的限制内。
请考虑型号:
class Model: NSObject {
/// Image object for the NSImageView
@objc dynamic var image: NSImage?
/// The target action for button `A`.
/// Changes the image inside model.
/// The change is not a KVO compliment because such a change is 'inside' the model.
@objc func a() {
self.image = NSImage(named: "a")
}
/// The target action for the button B
/// In the window UI
@objc func b() {
self.image = NSImage(named: "b")
}
}
这是圣经中最简单直接的绑定示例(What Are Cocoa Bindings?)。我想实现的区别是让用户可以看到图像更改过程。
我会拦截每一个从 NSObjectController 移动到 NSImageView 的新图像,并将其与旧图像一起传输。
class AnimatedImageView: NSImageView {
override func setValue(_ value: Any?, forKey key: String) {
// The code execution is never through this point.
if key == "image" {
self.transition(value as! NSImage?)
} else {
super.setValue(value, forKey: key)
}
}
private func transition(_ newImage:NSImage?) {
let transition = CATransition()
transition.duration = 1
transition.type = .fade
transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
self.layer?.add(transition, forKey: nil)
self.image = newImage
}
}
覆盖方法 setValue(_:forKey:)
的尝试未成功。
尽管如此,我知道方法 bind(...)
运行良好,应用程序本身运行良好,动画除外。
我错过了什么?
拜托,找到附件中的项目源是there。
值绑定器调用 Objective-C 方法 setObjectValue:
。在 Swift 中覆盖 objectValue
属性.
我正在尝试在 NSImageView 中为图像变化设置动画。这是一个纯学术问题,我在macOS绑定框架的限制内。
请考虑型号:
class Model: NSObject {
/// Image object for the NSImageView
@objc dynamic var image: NSImage?
/// The target action for button `A`.
/// Changes the image inside model.
/// The change is not a KVO compliment because such a change is 'inside' the model.
@objc func a() {
self.image = NSImage(named: "a")
}
/// The target action for the button B
/// In the window UI
@objc func b() {
self.image = NSImage(named: "b")
}
}
这是圣经中最简单直接的绑定示例(What Are Cocoa Bindings?)。我想实现的区别是让用户可以看到图像更改过程。
我会拦截每一个从 NSObjectController 移动到 NSImageView 的新图像,并将其与旧图像一起传输。
class AnimatedImageView: NSImageView {
override func setValue(_ value: Any?, forKey key: String) {
// The code execution is never through this point.
if key == "image" {
self.transition(value as! NSImage?)
} else {
super.setValue(value, forKey: key)
}
}
private func transition(_ newImage:NSImage?) {
let transition = CATransition()
transition.duration = 1
transition.type = .fade
transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
self.layer?.add(transition, forKey: nil)
self.image = newImage
}
}
覆盖方法 setValue(_:forKey:)
的尝试未成功。
尽管如此,我知道方法 bind(...)
运行良好,应用程序本身运行良好,动画除外。
我错过了什么?
拜托,找到附件中的项目源是there。
值绑定器调用 Objective-C 方法 setObjectValue:
。在 Swift 中覆盖 objectValue
属性.