NSView в Objective C — Xcode Mac OS

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

 

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *