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]不起任何作用(没有任何灯光)。