2012-09-15 39 views
2

我正试图完成鼠标悬停在事件上的按钮。所以我分类NSButton,其中是NSTrackingArea和方法- (void)mouseEntered:(NSEvent *)event- (void)updateTrackingAreas。按钮的NSButton NSTrackingArea - 跟踪不起作用

创建看起来如此(这是在循环,所以我用数组收集):

 CalendarTile *button = [[CalendarTile alloc] init]; 

     [button setFrame:CGRectMake(point_x, point_y, button_frame_width, button_frame_height)]; 
     [button setBordered:NO]; 
     [button setBezelStyle:NSRegularSquareBezelStyle]; 
     [button setButtonType:NSMomentaryChangeButton]; 
     [button setFont:[NSFont fontWithName:@"Avenir Next" size:40]]; 
     [button setAlignment:NSCenterTextAlignment]; 

     [button setTitle:[NSString stringWithFormat:@"%i", i]]; 
     [button setTextColor:[NSColor colorWithCalibratedRed:(float)62/255 green:(float)62/255 blue:(float)62/255 alpha:1.0]]; 

     [arrayWithButtons addObject:button]; 

     ... 

     for (CalendarTile *btn in arrayWithButton) { 
     [self addSubview:btn]; 
     } 

这是一个子类 - CalendarTile.m:

@implementation CalendarTile 
- (void)updateTrackingAreas 
{ 
    [super updateTrackingAreas]; 

    if (trackingArea) 
    { 
     [self removeTrackingArea:trackingArea]; 
    } 

    NSTrackingAreaOptions options = NSTrackingInVisibleRect | NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow; 
    trackingArea = [[NSTrackingArea alloc] initWithRect:NSZeroRect options:options owner:self userInfo:nil]; 
    [self addTrackingArea:trackingArea]; 
} 

- (void)mouseEntered:(NSEvent *)event 
{ 
    [self setImage:[NSImage imageNamed:@"highlight.png"]]; 
    NSLog(@"HIGHLIGHT"); 
} 

应该说,在当鼠标悬停时记录“HIGHLIGHT” - 很遗憾没有。

你能帮我吗?我错了什么?

+0

你确定你想用NSZeroRect初始化跟踪区吗? – TheAmateurProgrammer

+0

好吧,我根据这个问题解决了我的问题: http://stackoverflow.com/questions/7889419/cocoa-button-rollovers-with-mouseentered-and-mouseexited –

回答

0

尝试

trackingArea = [[NSTrackingArea alloc] initWithRect:NSZeroRect options:options owner:self userInfo:nil]; 

,而不是

NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways; 
    trackingArea = [[NSTrackingArea alloc] initWithRect:self.frame options:options owner:self userInfo:nil]; 
+0

我不认为设置NSZeroRect将修复问题。通常它被设置为'self.bounds'。 –

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"); 

}