我想制作一个自定义弹出菜单,在深色背景上有浅色文本。我知道
setView:
的 NSMenuItem
方法,我可以用它来使每个项目在深色背景上用浅色文本绘制。然而,NSMenu
在菜单的顶部和底部以浅色绘制了 4 像素高的条带,这几乎破坏了外观。由于 NSMenu
没有任何我可以覆盖的公共绘图方法,所以我不知道如何摆脱这些条带。
我看到
NSMenu
标头具有名为 noTopPadding
和 noBottomPadding
的私有实例变量。太诱人了!
我找到了一个使用未声明方法的解决方案(显然并不理想)。首先声明如下:
@interface NSMenu (secret)
- (void) _setHasPadding: (BOOL) pad onEdge: (int) whatEdge;
@end
然后,在显示菜单之前,执行以下操作:
if ([menu respondsToSelector: @selector(_setHasPadding:onEdge:)])
{
[menu _setHasPadding: NO onEdge: 1];
[menu _setHasPadding: NO onEdge: 3];
}
我的测试表明,这不适用于 Snow Leopard,但适用于 Lion、Mountain Lion 和 Mavericks。
按照 @JWWalker 的方法,您可以在 Swift 中通过创建头文件和实现文件来完成此操作,如下所示:
NSMenu.h
#import <AppKit/AppKit.h>
#ifndef NSMenu_h
#define NSMenu_h
@interface NSMenu (secret)
- (void) _setHasPadding: (BOOL) pad onEdge: (int) whatEdge;
- (void) setHasPadding: (BOOL) pad onEdge: (int) whatEdge;
@end
#endif /* NSMenu_h */
NSMenu.m
#import <Foundation/Foundation.h>
#import "NSMenu.h"
@implementation NSMenu (secret)
- (void) setHasPadding: (BOOL) pad onEdge: (int) whatEdge {
[self _setHasPadding: pad onEdge: whatEdge];
}
@end
不要忘记在桥接标头中导入
NSMenu.h
!
#import "NSMenu.h"
然后,你可以像这样调用Swift中的代理方法:
let menu = NSMenu()
menu.addItem(menuItem)
menu.setHasPadding(false, onEdge: 1)
menu.setHasPadding(false, onEdge: 3)