使用mouseEntered的可可按钮翻转:和mouseExited:?

时间:2011-10-25 12:41:28

标签: objective-c cocoa

为了在按钮上创建翻转效果,我创建了一个名为Button的NSButton的子类。

Button.h:

#import <AppKit/AppKit.h>

@interface Button : NSButton {
}

- (void)mouseEntered:(NSEvent *)theEvent;
- (void)mouseExited:(NSEvent *)theEvent;
- (void)mouseDown:(NSEvent *)ev;
- (void)mouseUp:(NSEvent *)theEvent;

@end

Button.m:     #import“Button.h”

@implementation Button

- (id)initWithFrame:(NSRect)frameRect  {
    self = [super initWithFrame:frameRect];
    if(self != nil) {
    NSLog(@"btn init");
}
    return self;
}


- (void)mouseEntered:(NSEvent *)theEvent{
    NSLog(@"mouseEntered");
    [self setImage:[NSImage imageNamed:@"lockIcon_2.png"]];
    [self setNeedsDisplay];
}
- (void)mouseExited:(NSEvent *)theEvent{
    [self setImage:[NSImage imageNamed:@"lockIcon_1.png"]];
    NSLog(@"mouseExited");  
    [self setNeedsDisplay];
}

- (void)mouseDown:(NSEvent *)ev {
    NSLog(@"mouseDown!");
}

- (void)mouseUp:(NSEvent *)ev {
    NSLog(@"mouseUp!");
}

@end

使用上面的代码,每次单击按钮时我都会在日志中看到“mouseDown”,但是我看不到“mouseEntered”和“mouseExited”(当然看不到图像更改)? ?可悲的是,我知道我错过了一些明显的东西,但我只是没有看到它...... ???

2 个答案:

答案 0 :(得分:22)

问题是只有在将自定义NSTrackingArea添加到按钮时,NSButton才能处理某些鼠标事件。

尝试在按钮类中添加此代码。它帮助了我。如果他们不满意你也可以玩选项。

- (void)createTrackingArea
{
    NSTrackingAreaOptions focusTrackingAreaOptions = NSTrackingActiveInActiveApp;
    focusTrackingAreaOptions |= NSTrackingMouseEnteredAndExited;
    focusTrackingAreaOptions |= NSTrackingAssumeInside;
    focusTrackingAreaOptions |= NSTrackingInVisibleRect;

    NSTrackingArea *focusTrackingArea = [[NSTrackingArea alloc] initWithRect:NSZeroRect
            options:focusTrackingAreaOptions owner:self userInfo:nil];
    [self addTrackingArea:focusTrackingArea];
}


- (void)awakeFromNib
{
    [self createTrackingArea];
}

希望它有所帮助。

答案 1 :(得分:0)

虽然设置跟踪区域绝对是一种方法,但是NSButton / NSButtonCell已经内置了此功能。

检出NSButton的showsBorderOnlyWhileMouseInside以及相应的NSButtonCell的mouseEnteredmouseExited。它记录在这里:

https://developer.apple.com/documentation/appkit/nsbuttoncell/1527903-showsborderonlywhilemouseinside

根据您的用例,这可能会或可能不会起作用。对我来说,无论如何我还是将NSButtonCell子类化,所以它是完美的。要注意的一件事是,它还会影响对drawBezel的调用。