OS X 10.10中的自定义NSControl类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OS X 10.10中的自定义NSControl类相关的知识,希望对你有一定的参考价值。
我需要开发一个新的自定义NSControl。我能找到的所有指南和示例(包括Apple's Subclassing NSControl文章)都是围绕NSCell构建的。但是从10.10开始,NSControl上的所有与单元格相关的消息都已被弃用。
我尝试创建一个子类并通过IB中的自定义视图添加到我的项目中,但是我无法让控件接受第一响应者,尽管已启用,将refusesFirstResponder设置为NO,并从acceptsFirstResponder返回YES。而且我确信我错过了很多应该存在的功能(价值变化通知等)。
是否有更新的参考,显示如何开发控件?如果有的话,我的Google-fu会让我失望。谢谢!
您的问题可能是您从未将控件实际设置为第一响应者。只需点击它就不会自动完成。下面是一个快速示例,它接受第一响应者状态(并且在点击时也是如此),并绘制一个焦点环。确保启用控件并设置其目标和操作。
class MyControl: NSControl {
override var acceptsFirstResponder: Bool {
return true
}
override func becomeFirstResponder() -> Bool {
return true
}
override func mouseDown(with event: NSEvent) {
window?.makeFirstResponder(self)
}
override func mouseUp(with event: NSEvent) {
if let action = action {
NSApp.sendAction(action, to: target, from: self)
}
}
override func draw(_ dirtyRect: NSRect) {
NSColor.white.set()
NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).fill()
if window?.firstResponder == self {
NSColor.keyboardFocusIndicatorColor.set()
} else {
NSColor.black.set()
}
NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).stroke()
}
override var focusRingMaskBounds: NSRect {
return bounds.insetBy(dx: 1, dy: 1)
}
override func drawFocusRingMask() {
NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).fill()
}
}
以上是关于OS X 10.10中的自定义NSControl类的主要内容,如果未能解决你的问题,请参考以下文章
NSControl isEnabled 仅在 OS X v10.0 到 OS X v10.9 中可用
mac os x10.10批量重命名教程:os x 10.10批量修改文件名步骤
sh 翻译:“OS X 10.10 Yosemite本地开发环境,Apache,PHP和MySQL与Homebrew”:3。停止如果已经安装了并且在运行中的Apache
安装 Mac OS X Yosemite (Mac OS 10.10) 后 Eclipse 无法启动