Изменить размер NSPopupButton до выбранного заголовка

У меня есть кнопка 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 ответа

Решение

Я решил эти проблемы с текстовыми полями, пытаясь изменить их размер с помощью текстового поля, которое вы никогда не добавляете в иерархию представлений. Вы вызываете 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;

For projects with autolayout override method 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
    }
}
Другие вопросы по тегам