NSButton в Swift, обработка событий щелчка и отпускания

я пытаюсь управлять различным состоянием простой кнопки в приложении OS X: когда пользователь нажимает на нее и когда пользователь отпускает щелчок.

В настоящее время я устанавливаю тип кнопки с помощью NSMomentaryLightButton.

NSMomentaryLightButton Когда кнопка нажата (включено), она подсвечивается. Если кнопка имеет границы, она также может казаться утопленной. Когда кнопка отпущена, она возвращается в нормальное (выключенное) состояние.

Этот тип кнопки лучше всего подходит для простого запуска действий, потому что он не показывает свое состояние; он всегда отображает свое обычное изображение или заголовок. Этот параметр называется Momentary Light в инспекторе кнопок Interface Builder.

Я думал, что это хороший способ, но когда я печатаю статус своей кнопки, это похоже на кнопку-переключатель, а не на кнопку, которую я установил. Как видно из примера gif

Подводя итог, Как добиться реального поведения кнопки? Вызывать функцию, когда пользователь нажимает на нее, и когда пользователь отпускает щелчок.

Благодарить,


person Kyz    schedule 20.08.2016    source источник
comment
С обычной кнопкой вы должны вызывать действие только тогда, когда пользователь отпускает щелчок. Никто никогда не ожидает отдельного действия, когда нажимает на кнопку — у них все еще есть шанс передумать. Вы имеете в виду: developer.apple.com/library/mac/documentation/Cocoa/Reference/ ? Другими словами, тумблер? Можете ли вы уточнить свой язык?   -  person BaseZen    schedule 21.08.2016
comment
Извините за мой плохой английский. В моем приложении кнопки на фортепианной клавиатуре, поэтому я хотел бы запускать что-то, когда пользователь нажимает вниз, и другое, когда нажимает вверх. В настоящее время кнопка меняет свое состояние для каждого щелчка, чем имеет два состояния при одном щелчке. Это понятно ? :/   -  person Kyz    schedule 21.08.2016
comment
наконец, я нашел решение: переопределить общедоступную функцию mouseDown (theEvent: NSEvent) { Swift.print (MouseDown!)} переопределить общедоступную функцию mouseUp (theEvent: NSEvent) { Swift.print (Mouse Up!)}   -  person Kyz    schedule 22.08.2016


Ответы (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:

Это намного больше работы, но это единственный способ создать по-настоящему профессионально выглядящую симуляцию фортепиано. Затем вы можете визуализировать клавиши с любым контуром, заливкой и маркировкой, которые вам нужны, без ограничений встроенных форм кнопок и макета. Например, вы можете даже слегка закруглить нижние края клавиш или применить блестящую текстуру.

person BaseZen    schedule 22.08.2016