【问题标题】:NSButton NSTrackingArea - tracking doesn't workNSButton NSTrackingArea - 跟踪不起作用
【发布时间】:2012-09-15 09:50:12
【问题描述】:

我正在尝试完成在鼠标悬停事件上突出显示的按钮。所以我将NSButton 子类化,NSTrackingArea 和方法- (void)mouseEntered:(NSEvent *)event- (void)updateTrackingAreas.

按钮的创建看起来是这样(它在循环中,所以我使用数组来收集):

        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” - 遗憾的是它没有。

你能帮帮我吗?我哪里错了?

【问题讨论】:

标签: objective-c xcode macos cocoa nsbutton


【解决方案1】:

这是我完美地为我创造和工作的……

第 1 步:创建带有跟踪区域的 Button

 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】:

    试试

    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];
    

    【讨论】:

    • 我认为设置 NSZeroRect 不会解决问题。通常设置为self.bounds
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2012-04-28
    • 2016-12-23
    • 2016-07-10
    相关资源
    最近更新 更多