Используя объекты области отслеживания

Экземпляр NSTrackingArea класс определяет область представления, которое является быстро реагирующим к перемещениям мыши. Когда курсор мыши вводит эту область, перемещается в ней и оставляет ее, Набор Приложения отправляет (в зависимости от указанных опций) отслеживание мыши, перемещенное в мышь, и сообщения обновления курсора к заданному объекту.

Набор Приложения отправляет отслеживающие мышь сообщения mouseEntered: и mouseExited: к объекту, когда курсор мыши вводит и выходит из области окна. Отслеживание мыши позволяет представлению, владеющему областью ответить, например, путем рисования цвета подсветки или отображения подсказки. Набор Приложения также отправляет mouseMoved: сообщения к объекту, если NSMouseMoved типы событий требуют. События обновления курсора являются специальным видом отслеживающего мышь события, которое Набор Приложения обрабатывает автоматически. Когда указатель мыши вводит прямоугольник курсора, Набор Приложения выводит на экран изображение курсора, надлежащее типу представления под прямоугольником; например, когда указатель мыши вводит текстовое представление, курсор I-луча выведен на экран.

Разделы в этой главе описывают, как создать NSTrackingArea объекты, присоедините их к представлениям, реагируйте на связанные события и управляйте объектами, когда произойдут изменения в поле зрения геометрия.

Создание объекта NSTrackingArea

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

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

Вы инициализируете выделенный экземпляр 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, получающийся в следующих импликациях:

Кроме того, следующий NSWindow связанными с курсором методами является устаревший API, но сохраняемый для совместимости: