对文本使用 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:
因为这为我提供了正确居中的绘图框架并使整个代码更短.
我喜欢显示没有箭头的 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:
因为这为我提供了正确居中的绘图框架并使整个代码更短.