将NSPopupButton调整为其选定的标题

时间:2012-11-24 07:49:58

标签: cocoa nspopupbutton nspopupbuttoncell

我有一个NSPopupButton,我想要它调整自己的大小以适应所选的标题。

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

我已经尝试过,但没有成功,关闭的是

#define ARROW_WIDTH 20
NSDictionary *displayAttributes = [NSDictionary dictionaryWithObjectsAndKeys:[popup font], NSFontAttributeName, nil];
NSSize titleSize = [popup.titleOfSelectedItem sizeWithAttributes:displayAttributes] + ARROW_WIDTH;

但是常量值ARROW_WIDTH是一个非常脏且容易出错的解决方案。

状态栏上的TextWrangler编码组合就像我需要的那样工作

2 个答案:

答案 0 :(得分:5)

我使用文本字段处理这些问题的方法是尝试使用您从未添加到视图层次结构的文本字段来调整大小。您可以在无意重用的对象上调用sizeToFit,然后使用它来确定实际控制需要多大以满足您的需要。

所以,在伪代码中,你会这样做(假设你使用ARC,YMMV用于非ARC项目,因为这会泄漏):

NSArray *popupTitle = [NSArray arrayWithObject: title];
NSPopUpButton *invisiblePopup = [[NSPopUpButton alloc] initWithFrame: CGRectZero pullsDown: YES];
// Note that you may have to set the pullsDown bool to whatever it is with your actual popup button.
[invisiblePopup addItemWithTitle: @"selected title here"];
[invisiblePopup sizeToFit];
CGRect requiredFrame = [invisiblePopup frame];
self.actualPopup.frame = requiredFrame;

答案 1 :(得分:0)

对于intrinsicContentSize子类中具有自动布局覆盖方法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
    }
}