您是否仍应在2018年对NSControl进行子类化

时间:2018-05-20 16:03:25

标签: macos cocoa appkit

截至2018年,使用AppKit / Cocoa创建自定义控件的正确方法是什么?

传统技术是将NSControl和/或NSCell作为您正在实施的自定义控件类型的子类。 (例如进行自定义绘图的NSButton。)

然而,在WWDC 2014-204中,Apple声称NSCell正在走向正式弃用"正式弃用"。在WWDC 2012-217中,Apple建议继承NSView并利用图层支持和图层属性绘制一个简单的按钮。

如果你继承NSView来创建一个自定义控件(例如"更好的按钮")那么你将失去NSControl提供的许多功能,例如预先布线actiontarget属性,鼠标跟踪,键盘激活以及其他一些我甚至都不知道的事情。

如果你继承NSControl,甚至NSButton,那么接管所有绘图的正确方法是什么? Apple's Programming Guide尚未针对此进行更新。特别是,NSButton子类可以覆盖自身和draw...的所有NSCell方法,然后在updateLayer中执行它想要执行的操作吗?是否可以保证现有的NSButton/NSButtonCell绘图代码仍然无法进行任何绘图?

如果您想构建一个具有自定义背景但仍使用基于字符串的titleattributedTitle的按钮,该怎么办? NSButton提供此功能,但title绘图如何与updateLayer互动?

我的用例是创建一个自定义按钮,提供比传统NSButton更多的视觉状态和更多视觉设计。使用支持图层的NSViewupdateLayer可以轻松实现所有不同的状态,但我更喜欢将NSControlNSButton作为子类,以便我还保留了这些类已经提供的所有功能。

编辑1:根据以下评论更改了措辞,以更准确地反映NSCell的当前弃用状态。

0 个答案:

没有答案