Простой эффект наведения мыши на NSButton - PullRequest
18 голосов
/ 23 мая 2011

Я создаю пользовательский NSButtonCell для пользовательского рендеринга.

Теперь я хочу иметь другой аспект в зависимости от того, находится ли мышь над кнопкой или нет.Как я могу получить эту информацию?

Спасибо и всего наилучшего,

Ответы [ 5 ]

30 голосов
/ 25 февраля 2014

Вот, я создал и работал для меня отлично ...

Шаг 1: Создайте кнопку с областью отслеживания

 NSButton *myButton = [[NSButton alloc] initWithFrame:NSMakeRect(100, 7, 100, 50)];
[myButton setTitle:@"sample"];

[self.window.contentView addSubview:myButton];
// Insert code here to initialize your application
NSTrackingArea* trackingArea = [[NSTrackingArea alloc]
                                initWithRect:[myButton bounds]
                                options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways
                                owner:self userInfo:nil];
[myButton addTrackingArea:trackingArea];

Шаг: 2 Реализуйте следующие методы

- (void)mouseEntered:(NSEvent *)theEvent{
NSLog(@"entered");
[[myButton cell] setBackgroundColor:[NSColor blueColor]];


}

- (void)mouseExited:(NSEvent *)theEvent{
[[myButton cell] setBackgroundColor:[NSColor redColor]];
NSLog(@"exited");

}
12 голосов
/ 08 июля 2017

Swift 3:

Создайте кнопку с кодом или просто используйте ее @IBOutlet. Затем определите область отслеживания кнопки при наведении курсора мыши:

let area = NSTrackingArea.init(rect: yourButtonName.bounds,
                               options: [.mouseEnteredAndExited, .activeAlways], 
                               owner: self, 
                               userInfo: nil)
yourButtonName.addTrackingArea(area)

Затем переопределите mouseEntered и mouseExited, установите все, что вы хотите изменить (цвет кнопки, изображение кнопки, текст кнопки, ..) в следующих функциях:

override func mouseEntered(with event: NSEvent) {
    print("Entered: \(event)")
}

override func mouseExited(with event: NSEvent) {
    print("Exited: \(event)")
}

Если у вас есть несколько кнопок (с каждой областью отслеживания, добавленной для каждой), и вам нужно определить, какая кнопка вызвала событие mouseEntered, вы можете добавить для этого некоторую информацию userInfo, поэтому вместо:

userInfo: nil

Добавьте свое пользовательское имя кнопки в userInfo для каждой кнопки, например:

userInfo: ["btnName": "yourButtonName"]

Затем вы можете написать switch-case или if в ваших функциях mouseEntered и mouseExited, например:

override func mouseEntered(with event: NSEvent) {
        // Identify which button triggered the mouseEntered event
        if let buttonName = event.trackingArea?.userInfo?.values.first as? String {
            switch (buttonName) {
            case "yourButtonName":
                //do whatever you want for this button..
            case "anotherButtonName":
                //do whatever you want for this button..
            default:
                print("The given button name: \"\(buttonName)\" is unknown!")
            }
        }
    }
9 голосов
/ 23 мая 2011

Вам необходимо создать подкласс класса NSButton (или, что еще лучше, класса NSButtonCell). Как сказал Джастин, если поставить два метода

- (void)mouseEntered:(NSEvent *)theEvent;
- (void)mouseExited:(NSEvent *)theEvent;

Они должны быть вызваны, когда мышь входит и выходит из области. Вам также может понадобиться заново создать область отслеживания, посмотрите здесь:

- (void)updateTrackingAreas

Для эффекта затухания и затухания я играл с аниматором и альфа-значением, например:

[self animator]setAlphaValue:0.5]; 
3 голосов
/ 23 мая 2011

хорошая отправная точка, объявленная в NSResponder:

- (void)mouseEntered:(NSEvent *)theEvent;
- (void)mouseExited:(NSEvent *)theEvent;

в частности, контейнер ячейки кнопки (не сама ячейка) - это NSResponder.

0 голосов
/ 26 июля 2018

Для тех, кто предпочитает создавать подклассы, вы также можете создать свой собственный NSButton и присвоить ему NSTrackingArea.

Вот действительно простой и элегантный способ сделать это, благодаря Джои Чжоу : https://github.com/Swift-Kit/JZHoverNSButton

Написано в Swift 2, но XCode автоматически переведет его в Swift 3 - 4 без каких-либо проблем.

Надеюсь, это может кому-то помочь

...