2016-08-20 9 views
2

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

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

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

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

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

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

Спасибо,

+0

С помощью обычной кнопки вы должны вызывать действие только тогда, когда пользователь отпускает клик. Никто никогда не ожидал отдельного действия, когда они нажимают на кнопку - у них все еще есть шанс передумать. Вы имеете в виду: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSButtonCell_Class/index.html#//apple_ref/c/econst/NSPushOnPushOffButton? Другими словами, тумблер? Вы можете уточнить свой язык? – BaseZen

+0

Извините за мой плохой английский. В моем приложении кнопки расположены на клавиатуре пианино, поэтому я хотел бы что-то запускать, когда пользователь нажимал, а другая - при нажатии.В настоящее время кнопка изменяет свое состояние для каждого щелчка, чем два состояния одним щелчком мыши. Так понятно ? :/ – Kyz

+0

наконец я нашел решение: переопределения общественного функа MouseDown (theEvent: NSEvent) { Swift.print ("! MouseDown") } переопределения общественного функ MouseUp (theEvent: NSEvent) { Swift.print ("Mouse Up! ") } – Kyz

ответ

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:

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

+0

спасибо :) теперь ясно. – Kyz