【问题标题】:NSButton in Swift, handle click and release eventsSwift 中的 NSButton,处理点击和释放事件
【发布时间】:2016-08-20 23:34:51
【问题描述】:

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

目前我通过 NSMomentaryLightButton

设置按钮类型

NSMomentaryLightButton 当按钮被点击时(开启状态),它 出现发光。如果按钮有边框,它也可能出现 凹陷。松开按钮时,它会恢复正常(关闭) 状态。

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

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

总结一下,我怎样才能有一个真正的按钮行为?当用户点击它时调用函数,当用户释放点击时。

谢谢,

【问题讨论】:

  • 使用常规按钮,您应该只在用户释放点击时触发操作。当他们按下按钮时,没有人会期望单独的动作——他们仍然有机会改变主意。你的意思是:developer.apple.com/library/mac/documentation/Cocoa/Reference/…?换句话说,拨动开关?你能澄清一下你的语言吗?
  • 抱歉我的英语不好。在我的应用程序中,按钮来自钢琴键盘,所以我想在用户按下时触发一些东西,而当用户按下时触发其他东西。目前,按钮每次点击都会改变他的状态,而不是一次点击有两个状态。清楚吗 ? ://
  • 最后我找到了解决方案:覆盖 public func mouseDown(theEvent: NSEvent) { Swift.print("MouseDown !") } override public func mouseUp(theEvent: NSEvent) { Swift.print("Mouse Up !") }

标签: swift macos button nsbutton nsbuttoncell


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    相关资源
    最近更新 更多