为了在按钮上创建翻转效果,我创建了一个名为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”(当然看不到图像更改)? ?可悲的是,我知道我错过了一些明显的东西,但我只是没有看到它...... ???
答案 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的mouseEntered
和mouseExited
。它记录在这里:
根据您的用例,这可能会或可能不会起作用。对我来说,无论如何我还是将NSButtonCell子类化,所以它是完美的。要注意的一件事是,它还会影响对drawBezel
的调用。