截至2018年,使用AppKit / Cocoa创建自定义控件的正确方法是什么?
传统技术是将NSControl
和/或NSCell
作为您正在实施的自定义控件类型的子类。 (例如进行自定义绘图的NSButton
。)
然而,在WWDC 2014-204中,Apple声称NSCell
正在走向正式弃用"正式弃用"。在WWDC 2012-217中,Apple建议继承NSView
并利用图层支持和图层属性绘制一个简单的按钮。
如果你继承NSView
来创建一个自定义控件(例如"更好的按钮")那么你将失去NSControl
提供的许多功能,例如预先布线action
和target
属性,鼠标跟踪,键盘激活以及其他一些我甚至都不知道的事情。
如果你继承NSControl
,甚至NSButton
,那么接管所有绘图的正确方法是什么? Apple's Programming Guide尚未针对此进行更新。特别是,NSButton
子类可以覆盖自身和draw...
的所有NSCell
方法,然后在updateLayer
中执行它想要执行的操作吗?是否可以保证现有的NSButton/NSButtonCell
绘图代码仍然无法进行任何绘图?
如果您想构建一个具有自定义背景但仍使用基于字符串的title
或attributedTitle
的按钮,该怎么办? NSButton
提供此功能,但title
绘图如何与updateLayer
互动?
我的用例是创建一个自定义按钮,提供比传统NSButton
更多的视觉状态和更多视觉设计。使用支持图层的NSView
和updateLayer
可以轻松实现所有不同的状态,但我更喜欢将NSControl
或NSButton
作为子类,以便我还保留了这些类已经提供的所有功能。
编辑1:根据以下评论更改了措辞,以更准确地反映NSCell的当前弃用状态。