我可以删除自定义 NSMenu 的顶部和底部填充吗?

问题描述 投票:0回答:2

我想制作一个自定义弹出菜单,在深色背景上有浅色文本。我知道

setView:
NSMenuItem
方法,我可以用它来使每个项目在深色背景上用浅色文本绘制。然而,
NSMenu
在菜单的顶部和底部以浅色绘制了 4 像素高的条带,这几乎破坏了外观。由于
NSMenu
没有任何我可以覆盖的公共绘图方法,所以我不知道如何摆脱这些条带。

我看到

NSMenu
标头具有名为
noTopPadding
noBottomPadding
的私有实例变量。太诱人了!

macos cocoa nsmenu
2个回答
3
投票

我找到了一个使用未声明方法的解决方案(显然并不理想)。首先声明如下:

@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。


0
投票

按照 @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)
© www.soinside.com 2019 - 2024. All rights reserved.