Используя объекты области отслеживания
Экземпляр NSTrackingArea
класс определяет область представления, которое является быстро реагирующим к перемещениям мыши. Когда курсор мыши вводит эту область, перемещается в ней и оставляет ее, Набор Приложения отправляет (в зависимости от указанных опций) отслеживание мыши, перемещенное в мышь, и сообщения обновления курсора к заданному объекту.
Набор Приложения отправляет отслеживающие мышь сообщения mouseEntered:
и mouseExited:
к объекту, когда курсор мыши вводит и выходит из области окна. Отслеживание мыши позволяет представлению, владеющему областью ответить, например, путем рисования цвета подсветки или отображения подсказки. Набор Приложения также отправляет mouseMoved:
сообщения к объекту, если NSMouseMoved
типы событий требуют. События обновления курсора являются специальным видом отслеживающего мышь события, которое Набор Приложения обрабатывает автоматически. Когда указатель мыши вводит прямоугольник курсора, Набор Приложения выводит на экран изображение курсора, надлежащее типу представления под прямоугольником; например, когда указатель мыши вводит текстовое представление, курсор I-луча выведен на экран.
Разделы в этой главе описывают, как создать NSTrackingArea
объекты, присоедините их к представлениям, реагируйте на связанные события и управляйте объектами, когда произойдут изменения в поле зрения геометрия.
Создание объекта NSTrackingArea
NSTrackingArea
объект определяет область представления, которое чувствительно к перемещениям мыши. То, когда мышь входит, перемещается, и выходы, что область, Набор Приложения отправляет отслеживание мыши, перемещенное в мышь, и сообщения обновления курсора. Область является прямоугольником, указанным в системе локальной координаты ее связанного представления. Когда объект области отслеживания создается, получатель сообщений (владелец) указан; несмотря на то, что владелец может быть любым объектом, это часто - представление, связанное с объектом области отслеживания.
Когда Вы создаете NSTrackingArea
объект необходимо указать одну или более опций. Эти опции, которые являются перечислимыми константами, объявленными классом, конфигурируют различные аспекты поведения области отслеживания. Они попадают в три общих категории:
Тип сообщения о событии отправил
Можно запросить
mouseEntered:
иmouseExited:
сообщения (NSTrackingMouseEnteredAndExited
); можно запроситьmouseMoved:
сообщения (NSTrackingMouseMoved
); и можно запроситьcursorUpdate:
сообщения (NSTrackingCursorUpdate
).Вы не ограничиваетесь единственной опцией от этого набора; можно выполнить работу битового «ИЛИ» для запроса многократных типов сообщений.
Активный объем сообщений области отслеживания
Когда область отслеживания должна активно генерировать события, необходимо указать одну из следующих опций запросить:
Когда связанное представление является первым респондентом (
NSTrackingActiveWhenFirstResponder
)Когда связанное представление находится в ключевом окне (
NSTrackingActiveInKeyWindow
)Когда связанное представление находится в активном приложении (
NSTrackingActiveInActiveApp
)В любом случае независимо от активации приложения (
NSTrackingActiveAlways
)
Улучшения поведения области отслеживания
Можно запросить, чтобы первое сообщение было отправлено, когда курсор мыши сначала оставляет область отслеживания (
NSTrackingAssumeInside
); можно запросить область отслеживания совпасть с видимым прямоугольником связанного представления (NSTrackingInVisibleRect
); и можно запросить, чтобы мышь перетащила в, и из отслеживания область генерируетmouseEntered:
иmouseExited:
события (NSTrackingEnabledDuringMouseDrag
).Вы не ограничиваетесь единственной опцией от этого набора; можно выполнить работу битового «ИЛИ» для запроса многократных улучшений на поведении.
Вы инициализируете выделенный экземпляр NSTrackingArea
с initWithRect:options:owner:userInfo:
метод. После создания объекта необходимо связать его с целью путем вызова NSView
метод addTrackingArea:
. Можно создать NSTrackingArea
экземпляр и добавляет его к представлению в любой точке, потому что (в отличие от отслеживающего мышь API в более ранних выпусках), успешное создание не зависит от представления, добавляемого к окну. Перечисление 6-1 показывает создание и добавление NSTrackingArea
экземпляр в пользовательском представлении initWithFrame:
метод; в этом случае представление владения запрашивает, чтобы отправил Набор Приложения mouseEntered:
, mouseExited:
и mouseMoved:
сообщения каждый раз, когда его окно является ключевым окном.
Перечисление 6-1 , инициализирующее NSTrackingArea
экземпляр
- (id)initWithFrame:(NSRect)frame { |
self = [super initWithFrame:frame]; |
if (self) { |
trackingArea = [[NSTrackingArea alloc] initWithRect:eyeBox |
options: (NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveInKeyWindow ) |
owner:self userInfo:nil]; |
[self addTrackingArea:trackingArea]; |
} |
return self; |
} |
Последний параметр initWithRect:options:owner:userInfo:
словарь, который можно использовать, чтобы передать произвольные данные получателю сообщений отслеживания мыши и обновления курсора. Принимающий объект может получить доступ к словарю путем отправки userData
к NSEvent
объект передал в mouseEntered:
, mouseExited:
, или cursorUpdate:
метод. Отправка userData
сообщения в mouseMoved:
методы вызывают отказ утверждения. (В примере в Перечислении 6-1 userInfo параметр устанавливается на nil
.)
Отслеживающие прямоугольные границы являются содержащими для главных и левых краев, но не для базовых и правых краев. Таким образом, если у Вас есть незеркально отраженное представление с прямоугольником отслеживания, покрывающим его границы, и кадр представления имеет геометрию frame.origin = (100, 100), frame.size = (200, 200)
, тогда область, для которой прямоугольник отслеживания активен, frame.origin = (100, 101), frame.size = (199, 199
), в координатах кадра.
Управление объектом области отслеживания
Поскольку NSTrackingArea
объекты принадлежат их представлениям, Набор Приложения может автоматически повторно вычислить области области отслеживания, когда представление добавлено или удалено из окна или когда представление меняет положение в своем окне. Но в ситуациях, где Набор Приложения не может повторно вычислить затронутую область отслеживания (или области), он отправляет updateTrackingAreas
к связанному представлению, прося, чтобы он повторно вычислил и сбросил области. Одна такая ситуация состоит в том, когда изменение в поле зрения расположение влияет на видимый прямоугольник представления (visibleRect
) — если NSTrackingArea
объект для того представления создавался с NSTrackingInVisibleRect
опция, когда Набор Приложения обрабатывает перерасчет. Обратите внимание на то, что Набор Приложения отправляет updateTrackingAreas
к каждому представлению, имеет ли это область отслеживания или нет.
Можно переопределить updateTrackingAreas
метод как показано в Перечислении 6-2 для удаления текущих областей отслеживания из их представлений выпустите их, и затем добавьте новый NSTrackingArea
объекты к тем же представлениям с повторно вычисленными областями.
Перечисление 6-2 , Сбрасывающее объект области отслеживания
- (void)updateTrackingAreas { |
NSRect eyeBox; |
[self removeTrackingArea:trackingArea]; |
[trackingArea release]; |
eyeBox = [self resetEye]; |
trackingArea = [[NSTrackingArea alloc] initWithRect:eyeBox |
options: (NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveInKeyWindow) |
owner:self userInfo:nil]; |
[self addTrackingArea:trackingArea]; |
} |
Если Ваш класс не является пользовательским классом представления, можно зарегистрировать экземпляр класса как наблюдатель для уведомление NSViewFrameDidChangeNotification
и имейте его, восстанавливают прямоугольники отслеживания при получении уведомления.
Ответ на отслеживающие мышь события
Владелец NSTrackingArea
объект, создаваемый с NSTrackingMouseEnteredAndExited
опция получает a mouseEntered:
каждый раз, когда курсор мыши вводит область представления, определенного объектом области отслеживания; впоследствии, это получает a mouseExited:
сообщения, когда листы мыши та область. Если NSTrackingMouseMoved
опция также указана для объекта области отслеживания, владелец также получает один или больше mouseMoved:
сообщения между каждым mouseEntered:
и mouseExited:
сообщение. Вы переопределяете соответствие NSResponder
методы для обработки этих сообщений для выполнения таких задач как выделение представления, отображение подсказки по инструменту пользователя или отображение соответствующей информации в другом представлении.
Код отслеживания в Перечислении 6-2 используется в том, чтобы заставлять «глазное яблоко» следовать за перемещением указателя мыши, когда это вводит прямоугольник отслеживания.
Обработка перечисления 6-3 вводимые в мышь, перемещенные в мышь, и вышедшие мышью события
- (void)mouseEntered:(NSEvent *)theEvent { |
NSPoint eyeCenter = [self convertPoint:[theEvent locationInWindow] fromView:nil]; |
eyeBox = NSMakeRect((eyeCenter.x-10.0), (eyeCenter.y-10.0), 20.0, 20.0); |
[self setNeedsDisplayInRect:eyeBox]; |
[self displayIfNeeded]; |
} |
- (void)mouseMoved:(NSEvent *)theEvent { |
NSPoint eyeCenter = [self convertPoint:[theEvent locationInWindow] fromView:nil]; |
eyeBox = NSMakeRect((eyeCenter.x-10.0), (eyeCenter.y-10.0), 20.0, 20.0); |
[self setNeedsDisplayInRect:eyeBox]; |
[self displayIfNeeded]; |
} |
- (void)mouseExited:(NSEvent *)theEvent { |
[self resetEye]; |
[self setNeedsDisplayInRect:eyeBox]; |
[self displayIfNeeded]; |
} |
Так же, как Вы можете с сообщениями мыши вниз и мыши, можно запросить переданный - в NSEvent
объекты получить информацию имели отношение к событию.
Управление событиями обновления курсора
Одно общее использование NSTrackingArea
объекты состоят в том, чтобы изменить изображение курсора по различным типам представлений. Текст, например, обычно требует курсора I-луча. Много классов Набора Приложения обеспечивают изображения курсора, надлежащие их экземплярам представления; Вы получаете это поведение “бесплатно “. Однако можно хотеть указать определенное (или отличающийся) изображение курсора для экземпляров пользовательских подклассов представления.
Вы изменяете изображение курсора для своего представления в переопределении NSResponder
метод cursorUpdate:
. Для получения этого сообщения необходимо создать NSTrackingArea
объект путем вызова initWithRect:options:owner:userInfo:
инициализатор с опцией NSTrackingCursorUpdate
(вместе с любыми другими желаемыми опциями). Тогда добавьте созданный объект к представлению с addTrackingArea:
. После того запись мыши в область отслеживания генерирует NSCursorUpdate
событие; NSWindow
возразите обрабатывает это событие путем отправки a cursorUpdate:
обменивайтесь сообщениями владельцу области отслеживания (который обычно является самим представлением). Реализация cursorUpdate:
должен использовать надлежащее NSCursor
методы для установки стандартного или пользовательского изображения курсора.
Прямоугольники курсора могут наложиться или быть полностью вложены, один в другом. Арбитраж обновлений курсора следует за нормальным механизмом цепочки респондента. Прямоугольник курсора представления под курсором мыши сначала получает cursorUpdate:
сообщение. Это может или вывести на экран курсор или передать сообщение цепочка респондента, где представление с перекрытым прямоугольником курсора может тогда реагировать на сообщение.
Перечисление 6-4 показывает реализацию cursorUpdate:
это устанавливает курсор представления к изображению перекрестия. Обратите внимание на то, что не необходимо сбросить изображение курсора назад к тому, чем это было, когда мышь выходит из области отслеживания. Набор Приложения обрабатывает это автоматически для Вас путем отправки a cursorUpdate:
обменивайтесь сообщениями к представлению, через которое перемещается курсор мыши, поскольку это выходит из прямоугольника курсора.
Перечисление 6-4 , Обрабатывающее событие обновления курсора
-(void)cursorUpdate:(NSEvent *)theEvent |
{ |
[[NSCursor crosshairCursor] set]; |
} |
Если респондент, владеющий объектом области отслеживания, не реализует cursorUpdate:
метод, реализация по умолчанию передает сообщение цепочка респондента. Если респондент реализует cursorUpdate:
но решает не обработать текущее событие, оно должно вызвать реализацию суперкласса cursorUpdate:
.
Как с любым другим отчасти NSTrackingArea
когда связанное представление имеет изменения в своем расположении или размере, объект, Вы, возможно, иногда должны были бы повторно вычислить и воссоздать объект области отслеживания, используемый для обновлений курсора. Посмотрите Управление Объектом области отслеживания для получения дополнительной информации.
Проблемы совместимости
Начинаясь с OS X v10.5, NSTrackingArea
класс и связанное NSView
методы addTrackingArea:
, removeTrackingArea:
, updateTrackingAreas
, и trackingAreas
замените следующие методы NSView
, которые считают устаревшим API, но остаются поддерживаемыми для совместимости:
NSTrackingRectTag
введите, возвращенный addTrackingRect:owner:userData:assumeInside:
и передал в removeTrackingRect:
методы, также устаревший тип. Внутренне этот тип обрабатывается то же как NSTrackingArea *
.
Конкретная реализация для устаревших методов основывается NSTrackingArea
, получающийся в следующих импликациях:
Вызов
addTrackingRect:owner:userData:assumeInside:
метод создаетNSTrackingArea
объект с опциямиNSTrackingMouseEnteredAndExited
иNSTrackingActiveAlways
набор. Это также включаетNSTrackingAssumeInside
опция, если последний параметр функцииYES
. После создания объекта это добавляет его к получателю (addTrackingArea:
) и возвраты это как тег.resetCursorRects
метод вызывается послеupdateTrackingAreas
.
Кроме того, следующий NSWindow
связанными с курсором методами является устаревший API, но сохраняемый для совместимости: