Содержание
Как узнать, что курсор мыши находится над 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, если представление создается программно. Но по хорошему, лучше для таких вещей все же использовать кастомные подклассы, чтобы не усложнять сам код программы и создать условия для более легкого расширения вашей программы в будущем.