对文本使用 NSPopupButton 的全宽,没有箭头

Using full width of NSPopupButton for text, no arrows

我喜欢显示没有箭头的 NSPopupButton。我喜欢在箭头指向标签文本的地方使用 space。默认情况下这似乎不起作用。

这是启用了箭头的文本(“01234567890”):

这里没有箭头:

如您所见,箭头所占的 space 并未被文本使用。

如何使用文本的完整内容宽度?

我用 F-Script 检查了控件,但发现控件的子视图数组似乎是空的 - 我原以为会找到两个子视图,如果是这样,我会删除一个箭头并使文本的箭头变宽。

实现此目的的一种方法是创建一个 NSPopupButtonCell subclass 并在其 drawTitle:withFrame:inView: 方法中自己绘制文本。

这是它的本质:

@interface MyCell : NSPopUpButtonCell
    @property NSDictionary<NSString*,id> *attrs;
@end

@implementation MyCell

-(NSRect)drawTitle:(NSAttributedString *)title withFrame:(NSRect)frame inView:(NSView *)controlView
{
    CGSize cs = controlView.bounds.size;
    CGPoint or = frame.origin;
    CGSize fs = frame.size;
    const int th = fs.height;
    const int inset = th * 2 / 3;
    const int indent = self.image ? th+6 : 0; // assuming the img is on the left of the text, we'll indent the text
    frame = CGRectMake (inset+indent, or.y, cs.width-2*inset-indent, fs.height);
    return [super drawTitle:title withFrame:frame inView:controlView];
}

@end

注意:此代码并未涵盖向菜单项添加图标的所有可能情况 - 它仅处理最常见的左侧有合适图标的情况,并且由于使用缩进,这仍然有点不稳定我通过反复试验找到的值。根据需要自行调整。

另请参阅@NSGod 下面关于在笔尖或情节提要中设置单元格 class 的评论。

更新: 优化代码只需要 NSPopUpButtonCell 的子 class 而不是 NSPopUpButton,感谢@NSGod .

更新 2: 我现在覆盖 drawTitleWithFrame:inView: 而不是实施 drawTitleWithFrame:inView: 因为这为我提供了正确居中的绘图框架并使整个代码更短.