3

我已经实现了一个带有图像的 NSButton。

当用户将其悬停时,图像会更改为其他内容,然后重新显示。


正常状态:

在此处输入图像描述

悬停时:

在此处输入图像描述


我用于的代码NSButtonCell是:

界面 :

#import <Foundation/Foundation.h>

@interface DKHoverButtonCell : NSButtonCell 
{
    NSImage *_oldImage;
    NSImage *hoverImage;
}

@property (retain) NSImage *hoverImage;

@end

执行 :

#import "DKHoverButtonCell.h"

@interface NSButtonCell()
- (void)_updateMouseTracking;
@end

@implementation DKHoverButtonCell

@synthesize hoverImage;

- (void)mouseEntered:(NSEvent *)event {
    if (hoverImage != nil && [hoverImage isValid]) {
        _oldImage = [[(NSButton *)[self controlView] image] retain];
        [(NSButton *)[self controlView] setImage:hoverImage];
    }
}

- (void)mouseExited:(NSEvent *)event {
    if (_oldImage != nil && [_oldImage isValid]) {
        [(NSButton *)[self controlView] setImage:_oldImage];
        [_oldImage release];
        _oldImage = nil;
    }
}

- (void)_updateMouseTracking {
    [super _updateMouseTracking];
    if ([self controlView] != nil && [[self controlView] respondsToSelector:@selector(_setMouseTrackingForCell:)]) {
        [[self controlView] performSelector:@selector(_setMouseTrackingForCell:) withObject:self];
    }
}

- (void)setHoverImage:(NSImage *)newImage {
    [newImage retain];
    [hoverImage release];
    hoverImage = newImage;
    [[self controlView] setNeedsDisplay:YES];
}

- (void)dealloc {
    [_oldImage release];
    [hoverImage release];
    [super dealloc];
}

@end

现在,这里是问题:

  • 尽管上述控件 100% 工作(带有“X”圆形图像和透明背景),但当用户单击它时,它会显示“白色”-ish 背景,而不是保留我旧的“透明”背景
  • 我应该如何解决这个问题?
4

2 回答 2

8

您需要将按钮的类型更改为Momentary Change。您可以在属性检查器中更改它:

怎么做

或以编程方式更改:

[button setButtonType:NSMomentaryChangeButton];
于 2012-04-21T20:10:58.857 回答
0

但是对于您的情况,使用从一开始就存在的showsBorderOnlyWhileMouseInside属性(OS X 10.0)就足够了。NSButtonCell只有当鼠标悬停在按钮内时,才会显示按钮的边框。将其与填充和浅灰色的边框样式相结合,它将非常接近您所获得的结果。

不需要子类化,也不需要使用未记录的 API 函数(在您的情况下,_updateMouseTracking)。

closeButton.bezelStyle = .inline
closeButton.setButtonType(.momentaryPushIn)

if let buttonCell = closeButton.cell as? NSButtonCell {
    buttonCell.showsBorderOnlyWhileMouseInside = true
}
于 2018-04-04T13:26:06.000 回答