Swift中的NSButton,处理点击和释放事件

时间:2016-08-20 23:34:51

标签: swift macos button nsbutton nsbuttoncell

我正在尝试管理OS X应用程序上的简单按钮的不同状态:当用户单击它时,以及当用户释放单击时。

目前我通过 NSMomentaryLightButton

设置我的按钮类型
  

NSMomentaryLightButton单击按钮(打开状态)时,它   看起来很明亮如果按钮有边框,也可能出现   凹陷。释放按钮后,它将恢复正常(关闭)   状态。

     

这种类型的按钮最​​适合简单地触发操作,因为它   不显示其状态;它始终显示其正常图像或标题。   此选项在Interface Builder的Button中称为Momentary Light   检查员

我认为这是好方法,但是当我打印我的按钮状态时,它就像一个切换按钮而不是我设置的按钮。正如您在exemple gif

上看到的那样

总结一下,我如何才能拥有真正的按钮行为?当用户点击它时以及当用户释放点击时调用功能。

感谢,

1 个答案:

答案 0 :(得分:1)

您不想使用钢琴键按钮。首先,它们是非矩形的,并且它们不像按钮那样起作用:既不是单动按钮,也不是切换开关。您正在使用自定义视图以自定义方式进行交互,这意味着不需要NSButton控件层次结构。相反,您将继承NSView子类并捕获低级鼠标事件,如下所示:

https://developer.apple.com/library/prerelease/content/documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html#//apple_ref/doc/uid/10000060i-CH6-SW1

你自己在自己的评论中详细说明了这一点,但我想确保你有更高层次的观点。将所有钢琴键合并到单个视图中,甚至可能是最好的,并让键本身使用{{1}进行渲染并使用NSBezierPath执行鼠标点击检测:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSBezierPath_Class/#//apple_ref/occ/instm/NSBezierPath/containsPoint

这是很多更多的工作,但却是制作真正专业的钢琴模拟的唯一方法。然后,您可以使用您需要的任何轮廓,填充和标签来渲染键,而不受内置按钮形状和布局的限制。例如,您甚至可以将键的下边缘略微倒圆,或者应用闪亮的纹理。