Cocoa 将NSPoupButton调整为其选定标题

Cocoa 将NSPoupButton调整为其选定标题,cocoa,nspopupbutton,nspopupbuttoncell,Cocoa,Nspopupbutton,Nspopupbuttoncell,我有一个NSpoupButton,我希望它能够调整自身大小以适应所选标题 [NSPoupButton sizeToFit]不适合我的需要,因为弹出窗口的大小已调整为最大标题项,而不是当前选定的标题项 我尝试了很多方法,但都没有成功 #define ARROW_WIDTH 20 NSDictionary *displayAttributes = [NSDictionary dictionaryWithObjectsAndKeys:[popup font], NSFontAttributeName,

我有一个NSpoupButton,我希望它能够调整自身大小以适应所选标题

[NSPoupButton sizeToFit]不适合我的需要,因为弹出窗口的大小已调整为最大标题项,而不是当前选定的标题项

我尝试了很多方法,但都没有成功

#define ARROW_WIDTH 20
NSDictionary *displayAttributes = [NSDictionary dictionaryWithObjectsAndKeys:[popup font], NSFontAttributeName, nil];
NSSize titleSize = [popup.titleOfSelectedItem sizeWithAttributes:displayAttributes] + ARROW_WIDTH;
但是,常量值ARROW_WIDTH是一个非常肮脏且容易出错的解决方案


状态栏上的TextWrangler encoding combo的工作原理就像我需要一样

我处理文本字段问题的方法是尝试使用从未添加到视图层次结构中的文本字段调整大小。对一个不打算重用的对象调用sizeToFit,然后使用它来计算实际控制需要多宽才能满足需要

因此,在伪代码中,您可以这样做(假设您将ARC、YMMV用于非ARC项目,因为这会泄漏):


对于在
NSPopUpButton

class NNPopUpButton: NSPopUpButton {
    override var intrinsicContentSize: NSSize {
        let fakePopUpButton = NSPopUpButton(frame: NSZeroRect, pullsDown: false)
        fakePopUpButton.addItem(withTitle: title)
        fakePopUpButton.sizeToFit()
        var requiredFrame = fakePopUpButton.frame
        requiredFrame.size.width -= 35 // reserved space for key equivalent
        return requiredFrame.size
    }
}

所以我想问题其实可以归结为:如何以编程方式查询弹出控件箭头/三角形的大小?
class NNPopUpButton: NSPopUpButton {
    override var intrinsicContentSize: NSSize {
        let fakePopUpButton = NSPopUpButton(frame: NSZeroRect, pullsDown: false)
        fakePopUpButton.addItem(withTitle: title)
        fakePopUpButton.sizeToFit()
        var requiredFrame = fakePopUpButton.frame
        requiredFrame.size.width -= 35 // reserved space for key equivalent
        return requiredFrame.size
    }
}