Объекты-события и типы

Почти все события в приложении Какао представлены объектами NSEvent класс. (Исключения включают события Apple, уведомления и подобные элементы.) Каждый NSEvent объект более узко представляет определенный тип события, каждого с его собственными требованиями для обработки. Следующие разделы описывают характеристики NSEvent возразите и возможные типы событий.

Объекты NSEvent

NSEvent объект — или, просто, объект-событие — содержит уместную информацию о входном действии, таком как щелчок мышью или нажатие клавиши. Это хранит такие подробные данные как, где мышь была расположена или какой символ был введен. Как описано в том, Как Событие Вводит Приложение Какао, сервер окна связывает каждое пользовательское действие с окном и сообщает о событии (в форме низшего уровня) к приложению, создавшему окно. Приложение временно помещает, каждое событие в буфере вызвало очередь событий. Когда приложение готово обработать событие, объект приложения (NSApp) берет один от очереди (обычно самая верхняя в очереди) и преобразовывает его в NSEvent объект прежде, чем диспетчеризировать его надлежащим объектам в приложении.

Объекты респондента приложения получают в настоящее время диспетчеризируемый объект-событие через параметр метода события, объявленного NSResponder класс (такой как mouseDown:). Кроме того, другие методы Набора Приложения позволяют любому объекту получить текущее событие или выбрать следующее событие (или следующее событие определенного типа) от очереди событий. Посмотрите Объекты-события в Методах Других Классов для получения дополнительной информации об этих методах.

Атрибуты объекта-события

NSEvent объект является в основном репозиторием только для чтения информации, связанной с определенным событием. Большинство методов NSEvent класс является методами доступа для получения значений атрибутов события. (NSEvent не имеет никаких соответствующих методов доступа «метода set», несмотря на то, что можно указать определенные атрибуты при создании объекта-события с помощью различных методов фабрики классов.) Объект, такой как респондент обычно использует методы доступа получить подробные данные события и таким образом знать, как обработать его.

Некоторые NSEvent в то время как другие являются определенными для определенных типов событий, атрибуты (и их соответствующие методы доступа) характерны для всех типов событий. Например, clickCount метод принадлежит только событиям от нажатия мыши и characters метод принадлежит только ключевым событиям. События планшета имеют много методов доступа, применяющихся только к ним. Некоторые более важные методы доступа NSEvent следующее:

ввести

Тип события; посмотрите Типы событий.

окно

NSWindow объект, представляющий окно, в котором событие имело место. С windowNumber можно также получить число, присвоенное сервером окна окну. Большинство, но не все события связано с окном; когда никакое окно не связано, window возвраты nil.

locationInWindow

Расположение события в основной системе координат окна.

modifierFlags

В то время как событие имело место, индикацию которого модифицирующие клавиши (Команда, Управление, Сдвиг, и т.д.) пользователь удержали.

символы

Символы Unicode сгенерированы ключевым событием. Можно также использовать charactersIgnoringModifiers получить символы ключевого события минус сгенерированные модифицирующими клавишами.

метка времени

Время событие произошло (в секундах начиная с системного запуска).

clickCount

Для событий от нажатия мыши в определенном пороге времени число щелчков связалось с определенным событием. (Это включает обнаружение двойных - или тройной щелчок.)

Методы класса NSEvent

Хотя Вы редко должны сделать так, можно создать объект-событие с нуля и или вставить его в очередь событий для распределения или отправить его непосредственно его месту назначения в сообщении о событии. NSEvent класс включает методы класса для создания объектов-событий определенного типа; например, для создания объекта-события типа мыши, можно использовать метод класса mouseEventWithType:location:modifierFlags:timestamp:windowNumber:context:eventNumber:clickCount:pressure:. Вы добавляете объекты-события к очереди событий путем вызова NSWindow метод postEvent:atStart: или тождественно именованный метод NSApplication класс.

Другой NSEvent метод класса, mouseLocation, возвращает текущее расположение мыши. Это отличается по нескольким важным отношениям от метода экземпляра locationInWindow. Будучи методом класса, это не требует, чтобы объект-событие отправил сообщение в; это возвращает расположение в координатах экрана, а не основе (окно) координаты; и это возвращает текущее расположение мыши, которое могло бы отличаться от того из тока или любого незаконченного события от нажатия мыши.

Объекты-события в методах других классов

NSEvent объекты рассеиваются всюду по Набору Приложения. Например, классы NSCell, NSCursor, NSClipView, NSMenu, NSSlider, и NSTableView у всех есть методы с объектами-событиями как возвращаемые значения или параметры. Однако несколько методов Набора Приложения, имеющих дело с объектами-событиями, особенно важны.

Несмотря на то, что большинство событий распределяется автоматически через цепочку респондента, иногда объект должен получить события явно — например, в то время как отслеживание мыши. Оба NSWindow и NSApplication определите метод nextEventMatchingMask:untilDate:inMode:dequeue:, который позволяет объекту получить события определенных типов от очереди событий.

NSApplication и NSWindow также оба определяют currentEvent метод, выбирающий последний объект-событие, полученный от очереди событий. Эти методы являются большим удобством, потому что они позволяют любому объекту в приложении узнать о событии, в настоящее время обрабатываемом в основном цикле событий.

Наконец, оба NSWindow и NSApplication определите sendEvent: метод. Реализации этих методов критически важны для отгрузки события. Поскольку эти методы являются точками трубы для событий в приложении, можно переопределить их при определенных обстоятельствах, чтобы узнать о событиях ранее в конечном счете поток или увеличить или изменить собственное поведение отгрузки события. Отгрузка события говорит о роли, которую играют sendEvent: методы.

Типы событий

type метод NSEvent возвраты NSEventType значение, идентифицирующее вид события. Тип события определяет в большой степени, как он должен быть обработан. Различные типы событий попадают в шесть групп:

Некоторые из этих групп включают несколько NSEventType константы, другие только один. Некоторые типы событий могли бы иметь подтипы, описанные в следующих разделах. NSEventType константы объявляются в NSEvent.h.

NSApplication и NSWindow методы, позволяющие Вам выборочно выбирать и отбрасывать события от очереди событий —nextEventMatchingMask:untilDate:inMode:dequeue: и discardEventsMatchingMask:beforeEvent:— возьмите одну или более констант маски типа события в первом параметре. Эти константы также объявляются в NSEvent.h.

События от нажатия мыши

События от нажатия мыши сгенерированы изменениями в состоянии кнопок мыши и изменениями в позиции курсора мыши на экране. Они попадают в две подкатегории, один связанный к щелчкам мышью и перемещениям и другое связанное с отслеживанием мыши и обновлениями курсора.

События, связанные с щелчками мышью и перемещениями

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

NSLeftMouseDown, NSLeftMouseUp, NSRightMouseDown, NSRightMouseUp, NSOtherMouseDown, NSOtherMouseUp

Пользователь щелкнул кнопкой мыши. Константы с «MouseDown» на их имена означают, что пользователь нажал кнопку; «MouseUp» означает, что пользователь выпустил его. Если мышь имеет всего одну кнопку, только оставленный события от нажатия мыши сгенерированы. Путем отправки a clickCount обменивайтесь сообщениями к событию, можно определить, было ли событие от нажатия мыши единственным щелчком, двойной щелчок и т.д. Мышь больше чем с двумя кнопками может генерировать события «OtherMouse».

NSLeftMouseDragged, NSRightMouseDragged, NSOtherMouseDragged

Пользователь перетащил мышь. Более в частности пользователь переместил мышь при нажатии одной или более кнопок. NSLeftMouseDragged когда мышь перемещена с ее левой кнопкой мыши вниз или с обеими кнопками вниз, события сгенерированы NSRightMouseDragged когда мышь перемещена только с правильной кнопкой вниз, и, события сгенерированы NSOtherMouseDragged когда устройство имеет больше чем две кнопки. Мышь с единственной кнопкой генерирует только оставленный перетащенные мышью события. Серии перетащенных мышью событий всегда предшествует событие mouseDown и сопровождает событие mouseUp.

NSMouseMoved

Пользователь переместил мышь без удержания любой кнопки мыши. Перемещенные в мышь события обычно не прослеживаются, поскольку они быстро лавинно рассылают очередь событий; используйте NSWindow метод setAcceptsMouseMovedEvents: включать отслеживание движений мыши.

NSScrollWheel

Пользователь управлял колесиком прокрутки мыши. Используйте NSEvent методы deltaX, deltaY, и deltaZ узнать, сколько это переместило. Если мышь не имеет никакого колесика прокрутки, это событие никогда не сгенерировано.

Примечание: Начало с OS X v10.5, NSScrollWheel события отправляются в окно под мышью, активно ли окно или неактивно. В более ранних версиях операционной системы события колесика прокрутки отправляются в окно под мышью, только если то окно имеет ключевой фокус (за исключением служебных окон, получающих те события, даже если они неактивны).

Перетащенные мышью и перемещенные в мышь события неоднократно сгенерированы, пока пользователь продолжает перемещать мышь. Если мышь является стационарной, никакой тип события не сгенерирован, пока мышь не перемещается снова.

Посмотрите События от нажатия мыши Обработки для получения дополнительной информации о событиях от нажатия мыши.

События отслеживания мыши

Поскольку следование за перемещениями мыши точно является дорогой работой, Набор Приложения обеспечивает менее интенсивный механизм для отслеживания расположения мыши. Это делает это, позволяя приложению определить области окна, названного отслеживанием прямоугольников, генерирующих события, когда курсор вводит или оставляет их. Типы событий NSMouseEntered и NSMouseExited и они сгенерированы, когда приложение попросило, чтобы сервер окна установил прямоугольник отслеживания в окне, обычно при помощи NSTrackingArea объекты или NSView метод addTrackingRect:owner:userData:assumeInside:. Окно может иметь любое число отслеживания прямоугольников; NSEvent метод trackingNumber идентифицирует прямоугольник, инициировавший событие.

Специальный вид отслеживания события NSCursorUpdate событие. Этот тип используется для реализации механизма прямоугольника курсора NSView класс. NSCursorUpdate когда курсор пересек границу предопределенной прямоугольной области, событие сгенерировано. NSApplication обычно дескрипторы NSCursorUpdate события и не диспетчеризируют их.

Посмотрите Используя Объекты области отслеживания для получения дополнительной информации.

Ключевые события

Среди наиболее распространенных событий, отправленных в приложение, прямые отчеты действий клавиатуры пользователя, идентифицированных ими NSEventType константы:

NSKeyDown

Пользователь генерировал символ или символы путем нажатия клавиши.

NSKeyUp

Пользователь отпустил клавишу. Этому событию всегда предшествует a NSKeyDown событие.

NSFlagsChanged

Пользователь нажал или выпустил модифицирующую клавишу или включил или выключил Caps Lock.

Из них ключевые вниз события являются самыми полезными для приложения. Когда тип события NSKeyDown, следующий шаг должен был обычно генерировать символы ключом вниз с помощью characters метод.

Ключевые события используются менее часто, так как они следуют почти автоматически, когда было ключевое вниз событие. И потому что NSEvent modifierFlags метод возвращает состояние модифицирующих клавиш независимо от типа события, приложения обычно не должны получать измененные на флаги события; они полезны только для приложений, которые должны отслеживать состояние этих ключей в любом случае.

Некоторые нажатия клавиш генерируют ключевые события, не представляющие символы, которые будут вставлены как текст. Вместо этого они представляют ключевые эквиваленты, команды управления интерфейсом клавиатуры или действия клавиатуры. Ключевые эквиваленты и команды управления интерфейсом клавиатуры обычно обрабатываются объектом приложения и не вызывают NSResponder метод связался с NSKeyDown события, keyDown:. Посмотрите Путь Ключевых событий для получения дополнительной информации.

Для получения дополнительной информации о ключевых событиях посмотрите Ключевые события Обработки.

События планшета

Планшетные устройства генерируют низкоуровневые события, которые приложение Какао получает как NSEvent объекты. Следующие разделы описывают планшетные устройства, характеристики событий планшета, и как Набор Приложения поддерживает события планшета.

Обзор планшетных устройств

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

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

OS X поддерживает планшетные устройства от нескольких производителей. Некоторые из этих планшетов могут реагировать на многократные манипуляторы на их поверхностях одновременно.

Типы событий планшета

Существует два типа событий планшета в Наборе Приложения: события близости и события указателя. Следующие разделы описывают, каковы они, как они связаны друг с другом и последовательностью близости и событий указателя в типичном сеансе планшета.

События близости

Событие близости является событием, которое генерирует планшетное устройство, когда указывающий преобразователь (например, стилус) подходит или переезжает от поверхности планшета. Это указывает запуск или конец связанной серии событий указателя (сеанс). Событие близости NSEvent объект типа NSTabletProximity. Приложение может определить, начинается ли сеанс указателя планшета или заканчивается путем отправки isEnteringProximity к объекту-событию.

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

Событие планшета типа близости переносит с ним ряд идентификаторов и атрибутов устройств, которые приложение может выбрать с методами доступа. Они включают следующее:

  • Устройство ID — основной идентификатор планшетного устройства, используемого для соединения событий типа указателя с событиями близости. Все события указателя планшета в сеансе имеют то же устройство ID.

    Средство доступа: deviceID

  • Манипуляторы — Чтобы помочь приложению различить среди манипуляторов, можно попросить у события близости порядкового номера устройства, его тип (например, перо или средство стирания), и, для планшетов, поддерживающих многократные параллельные манипуляторы, его устройство ID.

    Средства доступа: pointingDeviceSerialNumber, pointingDeviceType, pointingDeviceID

  • Планшеты — можно попросить у события близости идентификатора планшета (который является его номером модели USB), и, если существуют многократные планшеты, подключенные к системе, ее системный планшет ID.

    Средства доступа: tabletID, systemTabletID

  • Информация о поставщике — NSEvent объект с типом близости может содержать идентификатор поставщика и идентификатор манипулятора в выборе поставщиком устройств.

    Средства доступа: vendorID, vendorPointingDeviceType

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

    Средство доступа: capabilityMask

Обычно, когда приложение получает событие близости, оно хранит устройство ID и любой другой идентификатор, который необходим для различения среди различных элементов аппаратных средств планшета, вовлеченных в сеанс. Это тогда относится к этим идентификаторам при обработке событий указателя, чтобы гарантировать, что это обрабатывает правильные события. Приложение может также извлечь информацию об устройстве из событий близости (например, возможности планшета или тип указателя) и использовать эту информацию, чтобы сконфигурировать, как это имеет дело с событиями указателя.

События указателя

Событие указателя является событием, которое генерирует планшетное устройство после того, как стилус ввел близость планшета. Это указывает изменение в состоянии преобразователя. Например, если пользователь перемещает преобразователь стилуса через поверхность планшета или увеличивает давление или наклоняет манипулятор, событие указателя сгенерировано. Событие указателя NSEvent объект типа NSTabletPoint или объект, представляющий мышь вниз, перетащенную мышью, или событие mouseUp с подтипом NSTabletPointEventSubtype.

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

В дополнение к расположению указателя информация, доступная от событий указателя, включает следующее:

  • Давление, как значение между 0,0 и 1.0; Вы могли бы использовать атрибут давления для установки непрозрачности цвета.

    Средство доступа: pressure

  • Вращение, в градусах; Вы могли бы использовать атрибут вращения для моделирования пера каллиграфии.

    Средство доступа: rotation

  • Наклон, NSPoint структура, с обеими осями в пределах от-1 к 1; Вы могли бы использовать наклонный атрибут для предоставления различных цветов, в зависимости от угла и направления наклона.

    Средство доступа: tilt

  • Тангенциальное давление, как значение между-1.0 и 1.0 (только на определенных устройствах).

    Средство доступа: tangentialPressure

  • Номер кнопки преобразователя нажал.

    Средство доступа: buttonMask

  • Определенные поставщиками данные.

    Средство доступа: vendorDefined

Последовательность событий планшета

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

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

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

Возьмите, например, планшетное устройство, поддерживающее многократный манипулятор на поверхности планшета когда-то. Один манипулятор мог бы быть стилусом для получения строки; другой манипулятор мог бы применить эффект рисования распылителя. Поскольку рисунок 2-1 иллюстрирует, событие близости сгенерировано со стилусом получения, близко подходит к поверхности планшета.

  Указатель рисунка 2-1 A подходящий к планшету, генерируя событие близости
Pointer A coming near the tablet, generating proximity event

При обработке этого события близости приложение хранит устройство ID планшетного устройства, устройства ID манипулятора, и возможно также порядковый номер манипулятора и его типа. Пока это не получает следующее событие близости с этими теми же идентификаторами, это обрабатывает все события указателя, которые это получает для манипулятора — в этом случае, проводя линии (рисунок 2-2).

  Приложение рисунка 2-2, получающее события указателя
Application receiving pointer events

Теперь манипулятор распылителя переходит на поверхность планшета, генерируя другое событие близости (рисунок 2-3). Поскольку это событие переносит с ним различные идентификаторы, приложение знает не завершающееся событие близости для первого сеанса планшета. Вместо этого это объявляет о нависшей серии событий указателя для другого манипулятора. Таким образом, приложение хранит идентификаторы и конфигурационную информацию для этого сеанса.

  Указатель рисунка 2-3 B подходящий к планшету, генерируя событие близости
Pointer B coming near the tablet, generating proximity event

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

  Указатель рисунка 2-4 отъезд поверхности планшета, генерируя событие близости
Pointer A leaving the tablet surface, generating proximity event

Другие типы событий

Набор Приложения определяет несколько типов незначительного события. Некоторые из них редко используются, но они доступны, если Вы когда-нибудь находите потребность в них.

Периодическое событие (тип NSPeriodic) просто уведомляет приложение, что протек определенный временной интервал. Периодические события особенно полезны в ситуациях, где введенные события не сгенерированы, но Вы хотите, чтобы они были. Например, когда пользователь удерживает мышь по кнопке прокрутки, но не перемещает ее, никакие события не сгенерированы после события mouseDown. Набор Приложения прокрутка механизма тогда запускает и использует поток периодических событий для хранения прокрутки документа в разумном темпе до разъединений абонентом мышь. Когда событие mouseUp происходит, механизм прокрутки завершает периодический поток событий.

Вы используете NSEvent метод класса startPeriodicEventsAfterDelay:withPeriod: генерировать периодические события и разместить их в конечном счете очередь в определенной частоте. Когда Вам больше не будут нужны они, выключите поток периодических событий путем вызова stopPeriodicEvents. В отличие от ключевых событий и событий от нажатия мыши, периодические события не диспетчеризируются объекту окна. Приложение должно получить их явно использование NSApplication метод nextEventMatchingMask:untilDate:inMode:dequeue:, обычно в модальном цикле. Приложение может иметь только один поток периодических событий, активных для каждого потока. Вы используете периодические события вместо таймеров потому что NSPeriodic события поставлены вместе с другими событиями; это делает для объекта респондента искать периодические события вместе с мышью и перетащенные мышью события. такой, как сделан (например), во время прокрутки.

Остающиеся типы событий —NSAppKitDefined, NSSystemDefined, и NSApplicationDefined— менее структурированы, содержа только универсальный подтип и поля данных. Из этих трех разных типов событий, только NSApplicationDefined имеет реальное применение к прикладным программам. Это позволяет приложению генерировать пользовательские события и вставлять их в очередь событий. Каждое такое событие может иметь подтип и два дополнительных кода для дифференциации его от других. NSEvent метод otherEventWithType:location:modifierFlags:timestamp:windowNumber:context:subtype:data1:data2: создает одно из этих событий, и subtype, data1, и data2 методы возвращают информацию, определенную для этих событий.