Изменить размер 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
}
}