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

标签 swift macos button nsbutton nsbuttoncell

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

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

NSMomentaryLightButton When the button is clicked (on state), it appears illuminated. If the button has borders, it may also appear recessed. When the button is released, it returns to its normal (off) state.

This type of button is best for simply triggering actions because it doesn’t show its state; it always displays its normal image or title. This option is called Momentary Light in Interface Builder’s Button inspector

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

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

谢谢

最佳答案

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

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

正如您在自己的评论中详细说明的那样,您自己发现了这一点,但我想确保您有更高层次的观点。将所有的钢琴键整合到一个单个 View 中甚至是可能的,而且可能是最好的,并且让键本身使用NSBezierPath 呈现并使用 containsPoint 执行鼠标点击检测:

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

这是一项很多的工作,但却是制作真正具有专业外观的钢琴模拟的唯一方法。然后,您可以使用所需的任何轮廓、填充和标签来呈现按键,而不受内置按钮形状和布局的限制。例如,您甚至可以让按键的底部边缘略微变圆,或者应用 Shiny 的纹理。

关于swift - Swift 中的 NSButton,处理点击和释放事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39059607/

相关文章:

android - View 忽略 View.VISIBLE 之后的 alpha 值

swift - 不要点击 subview 中的按钮

ios - Xcode 7 Swift 2 后台页面加载

macos - 替换 mac osx 上正在运行的可执行文件

objective-c - 2 年前的代码现在不起作用(WindowController alloc)

c++ - 使用 WM_PARENTNOTIFY 检测子 CButton 控件何时添加到 CDialog

google-apps-script - 打开单元格以在 Google 表格中进行编辑

swift - 如何在再次循环之前完成 SKAction

arrays - 从嵌套的 for 函数中获取顶级索引

python - 尝试在 Mac(OS Catalina)上安装 ssh2-python 时遇到问题