3

我有一个 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 编码组合就像我需要的那样工作

4

2 回答 2

6

我用文本字段处理这些问题的方法是尝试使用您从未添加到视图层次结构中的文本字段调整大小。你在一个你不想重用的对象上调用 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;
于 2012-12-05T09:47:47.927 回答
1

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
    }
}
于 2018-09-16T06:45:20.733 回答