Подтвердить что ты не робот

Простой эффект наведения на NSButton

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

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

Спасибо и приветствую,

4b9b3361

Ответ 1

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

Шаг 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");

}

Ответ 2

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

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

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

- (void)updateTrackingAreas

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

[self animator]setAlphaValue:0.5]; 

Ответ 3

Swift 3:

Создайте кнопку с кодом или просто используйте имя кнопки, которое вы установили в Storyboard. Затем определите зону отслеживания кнопок для мыши (hover):

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: 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!")
            }
        }
    }

Ответ 4

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

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

в частности, контейнер ячейки кнопки (а не сама ячейка) является NSRsponder.