2

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

目前我通过NSMomentaryLightButton设置我的按钮类型

NSMomentaryLightButton 当按钮被点击时(开启状态),它看起来是亮的。如果按钮有边框,它也可能出现凹陷。释放按钮时,它会返回其正常(关闭)状态。

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

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

总而言之,我怎样才能拥有真正的按钮行为?当用户点击它时调用函数,当用户释放点击时。

谢谢,

4

1 回答 1

1

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

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

正如您在自己的评论中详述的那样,您自己发现了这一点,但我想确保您有更高层次的观点。将所有钢琴键合并到一个视图中甚至是可能的,并且可能是最好的,并使用以下方法渲染键本身NSBezierPath并执行鼠标敲击检测containsPoint

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

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

于 2016-08-22T17:21:15.240 回答