Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NSSWIFT中的按钮,处理单击和释放事件_Swift_Macos_Button_Nsbutton_Nsbuttoncell - Fatal编程技术网

NSSWIFT中的按钮,处理单击和释放事件

NSSWIFT中的按钮,处理单击和释放事件,swift,macos,button,nsbutton,nsbuttoncell,Swift,Macos,Button,Nsbutton,Nsbuttoncell,我试图管理OSX应用程序上简单按钮的不同状态:当用户单击按钮时,以及当用户释放按钮时 目前,我通过nsTemporaryLightButton设置按钮类型 NSInstantialyLightButton当单击按钮(打开状态)时 显示为亮起。如果按钮有边框,也可能出现 凹进去的。松开按钮后,它将恢复正常(关闭) 国家 这种类型的按钮最适合简单地触发操作,因为它 不显示其状态;它始终显示其正常图像或标题。 此选项称为Interface Builder按钮中的瞬时灯光 检查员 我认为这是一个好方法,

我试图管理OSX应用程序上简单按钮的不同状态:当用户单击按钮时,以及当用户释放按钮时

目前,我通过nsTemporaryLightButton设置按钮类型

NSInstantialyLightButton当单击按钮(打开状态)时 显示为亮起。如果按钮有边框,也可能出现 凹进去的。松开按钮后,它将恢复正常(关闭) 国家

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

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

总而言之,我如何才能拥有真正的按钮行为?当用户单击按钮时,以及当用户释放按钮时,调用函数


谢谢,

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

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

:


这是更多的工作,但唯一的方法,使一个真正的专业外观钢琴模拟。然后,您可以使用所需的任何轮廓、填充和标签渲染关键点,而不受内置按钮形状和布局的限制。例如,您甚至可以将关键点的底边稍微磨圆,或者应用有光泽的纹理。

使用常规按钮,您应该仅在用户释放单击时才执行操作。当他们按下一个按钮时,没有人会期望一个单独的动作——他们仍然有机会改变主意。你是说:?换言之,切换开关?你能澄清一下你的语言吗?对不起,我的英语不好。在我的应用程序中,按钮来自钢琴键盘,所以我想在用户按下时触发一些东西,而在用户向上按下时触发其他东西。当前,按钮每次单击都会更改其状态,而不是一次单击就有两个状态。清楚吗/最后我找到了解决方案:覆盖公共函数mouseDown(theEvent:NSEvent){Swift.print(“mouseDown!”)}覆盖公共函数mouseUp(theEvent:NSEvent){Swift.print(“Mouse Up!”)}