Содержание
Как узнать, что курсор мыши находится над NSView
Чтобы отследить заход курсора мыши над текстовым редактором или его выход, есть несколько способов, но суть одна, необходимо реализовать следующие методы: mouseEntered:event, mouseExited:event. Но чтобы реализовать методы mouseEntered: и mouseExited:, нам необходимо использовать class NSTrackingArea.
Вариант с подклассом NSView с методом viewWillMoveToWindow:
MyView.h
// // MyView.h // // // Created by Saveliy Severniy on 03.03.18. // Copyright © 2018 Saveliy Severniy. All rights reserved. // #import <Cocoa/Cocoa.h> @interface MyView : NSView @end
MyView.m
// // MyView.m // // // Created by Saveliy Severniy on 03.03.18. // Copyright © 2018 Saveliy Severniy. All rights reserved. // #import "MyView.h" @implementation MyView - (void)drawRect:(NSRect)dirtyRect { [super drawRect:dirtyRect]; // Drawing code here. } //------------------------------------------------------------------------// // Курсор мыши вошел в объект //------------------------------------------------------------------------// -(void)mouseEntered:(NSEvent *)event { NSLog(@"mouseEntered"); } //------------------------------------------------------------------------// // Курсор мыши вышел из объекта //------------------------------------------------------------------------// -(void)mouseExited:(NSEvent *)event { NSLog(@"mouseExited"); } //------------------------------------------------------------------------// // Если мы хотим использовать mouseEntered: и mouseExited: нам нужно // использовать class NSTrackingArea. //------------------------------------------------------------------------// - (void)viewWillMoveToWindow:(NSWindow *)newWindow { // Установить зону отслеживания объекта, когда View будет добавлен в Window. NSTrackingArea* trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] options: (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways) owner:self userInfo:nil]; // Добавляем объект NSTrackingArea в целевое представление [self addTrackingArea:trackingArea]; } @end
Вариант без создания подкласса NSView
Все это можно организовать и в основном коде View контроллера. Методы mouseEntered: и mouseExited:, указываете, как в примере выше, а вот метод viewWillMoveToWindow: нужно будет заменить на любой другой подходящий метод, как вариант, на тот, который вызывается по событию кнопки или который вызывается автоматически при загрузке представления, все зависит от вашей фантазии и ваших задач. Для автоматической загрузки существуют методы -awakeFromNib, если ваш View загружается из NIB файла, или метод -windowDidLoad, если представление создается программно. Но по хорошему, лучше для таких вещей все же использовать кастомные подклассы, чтобы не усложнять сам код программы и создать условия для более легкого расширения вашей программы в будущем.