我正在尝试管理OS X应用程序上一个简单按钮的不同状态:当用户点击它时,以及当用户释放点击时。
目前我设置我的按钮类型NSMomentaryLightButton
NSMomentaryLightButton当按钮被点击(on state)时,它似乎照亮。如果按钮有边框,它也可能出现休会。当按钮被释放时,它会恢复正常状态(关闭)。状态。
这种类型的按钮最适合简单地触发操作,因为它不显示它的状态;它总是显示其正常的图像或标题。这个选项在界面生成器的按钮中称为瞬时光检查员
我认为这是一个好方法,但是当我打印我的按钮状态时,它就像一个切换按钮而不是我设置的按钮。如你所见,gif
综上所述,如何拥有一个真正的按钮行为当用户点击它时调用函数,当用户释放点击时调用函数
谢谢,
您不希望使用按钮作为钢琴键。首先,它们是非矩形的,不像按钮那样:既不是单动作按钮,也不是拨动开关。您正在以自定义方式与自定义视图进行交互,这意味着不需要NSButton
控件层次结构。相反,您将子类化NSView
并捕获低级鼠标事件,如下所示:
https://developer.apple.com/library/prerelease/content/documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html//apple_ref/doc/uid/10000060 i-ch6-sw1
你在自己的评论中详细说明了这一点,但我想确保你有更高层次的观点。甚至有可能,并且可能是最好的,将所有的钢琴键合并到单个视图中,并让键本身使用NSBezierPath
呈现,并使用containsPoint
执行鼠标命中检测:
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSBezierPath_Class///apple_ref/occ instm/NSBezierPath/containsPoint:
这是一个很多更多的工作,但唯一的方法,使一个真正专业的钢琴模拟。然后,您可以使用所需的任何轮廓、填充和标签来渲染键,而不受内置按钮形状和布局的限制。例如,你甚至可以让键的底部边缘稍微圆一点,或者应用一个闪亮的纹理。