Macos 自定义单击时的无边框按钮行为?

Macos 自定义单击时的无边框按钮行为?,macos,cocoa,nsbutton,Macos,Cocoa,Nsbutton,我有一个无边框的NSButton(或多或少是一个带有动作的NSTextField),我希望它的行为像一个“基于图像”的按钮,也就是说,我希望用鼠标传递和单击按钮时按钮文本的颜色发生变化。有没有一个简单的方法来实现这一点 以下是我的按钮初始化上下文: NSButton* but =[[NSButton alloc] initWithFrame:NSMakeRect(5, 5, 125, 25)] ; [but setTitle:@"Do not show Again"];

我有一个无边框的
NSButton
(或多或少是一个带有动作的
NSTextField
),我希望它的行为像一个“基于图像”的按钮,也就是说,我希望用鼠标传递和单击按钮时按钮文本的颜色发生变化。有没有一个简单的方法来实现这一点

以下是我的按钮初始化上下文:

    NSButton* but =[[NSButton alloc] initWithFrame:NSMakeRect(5, 5, 125, 25)] ;
    [but setTitle:@"Do not show Again"];
    [but setButtonType:NSMomentaryLightButton]; //I figure it could be here
    [but setBezelStyle:NSHelpButtonBezelStyle];
    [but setBordered:NO];
    [but setAction:@selector(writeToUserDefaults)];
    [but setFont:[NSFont fontWithName:@"Arial" size:9.0]];
    [self.view addSubview:but];
不起作用的来源:


我的解决方案是什么(除了子类化NSButton?

解决方案是使用苹果文档中的NSTrackingArea

NSTrackingArea对象定义了一个视图区域,当鼠标位于该区域上时,该区域会生成鼠标跟踪和光标更新事件。

在您的情况下,您需要针对NSButton的框架设置一个跟踪区域,并在收到鼠标跟踪事件时更改文本颜色

- (void)awakeFromNib:(NSWindow *)newWindow 
{
    NSButton* but =[[NSButton alloc] initWithFrame:NSMakeRect(5, 5, 125, 25)] ;
    [but setTitle:@"Do not show Again"];
    [but setBezelStyle:NSHelpButtonBezelStyle];
    [but setBordered:NO];
    [but setAction:@selector(writeToUserDefaults)];
    [but setFont:[NSFont fontWithName:@"Arial" size:9.0]];
    [self.view addSubview:but];

    NSTrackingArea* trackingArea = [[NSTrackingArea alloc] initWithRect:[but frame] 
                                                                options:(NSTrackingInVisibleRect | NSTrackingEnabledDuringMouseDrag | NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways) 
                                                                  owner:self userInfo:nil];

[self.view addTrackingArea:trackingArea];
}

- (void) mouseEntered:(NSEvent*)theEvent {
    //Set text color
}

- (void) mouseExited:(NSEvent*)theEvent {
    //Reset text color
}

您可以通过子类化
NSButtonCell
来实现这一点,尽管这可能不是您想要的。非常感谢您的详细回答。点击部分呢?我找不到任何与mouseDown:或类似的跟踪事件。该按钮应该如何响应鼠标单击?这与鼠标悬停时发生的情况不同吗?我会立即使用稍深一点的颜色向用户显示窗口实际上注册了其点击,并且没有自动关闭。你认为这太多了吗?我认为这是多余的,据我所知,你也在关闭按钮动作中的窗口,这本身就是一个点击事件已注册的指示器。但是,您可以使用[but setButtonType:NSInstantialyLightButton]来显示某种指示。由于我的“按钮”只是一个“标签”,所以请将备注放在一旁,因为setButtonType:NSInstantialyLightButton]不起任何作用(没有任何灯光)。