我已经实现了一个带有图像的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
现在,问题在于:
答案 0 :(得分:8)
您需要将按钮类型更改为 瞬间更改 。您可以在“属性”检查器中更改它:
或以编程方式更改:
[button setButtonType:NSMomentaryChangeButton];
答案 1 :(得分:0)
但对于您的情况,使用showsBorderOnlyWhileMouseInside
的{{1}}属性应该足够了,该属性从一开始就存在(OS X 10.0)。仅当鼠标悬停在按钮内时,才会显示按钮的边框。将其与填充和浅灰色的边框样式相结合,将非常接近您已实现的结果。
没有子类化要求,也没有使用未记录的API函数(在您的情况下,NSButtonCell
)。
_updateMouseTracking