Использование полной ширины NSPopupButton для текста, без стрелок

Мне нравится отображать NSPopupButton без стрелок. Мне нравится использовать то место, где стрелки были бы для текста метки. Кажется, это не работает по умолчанию.

Вот текст (это "01234567890") с включенными стрелками:

введите здесь описание изображения

А вот без стрелок:

введите здесь описание изображения

Как видите, место, которое занимали бы стрелки, не занято текстом.

Как я могу использовать полную ширину содержимого для текста?

Я проверил элемент управления с помощью F-Script, но обнаружил, что массив подвидов элемента управления кажется пустым — я ожидал найти два подвида, и если бы это было так, я бы удалил один для стрелок и сделал один для текста шире.


person Thomas Tempelmann    schedule 23.05.2016    source источник


Ответы (1)


Один из способов добиться этого — создать подкласс NSPopupButtonCell и самостоятельно нарисовать текст в его методе drawTitle:withFrame:inView:.

Вот в чем суть:

@interface MyCell : NSPopUpButtonCell
    @property NSDictionary<NSString*,id> *attrs;
@end

@implementation MyCell

-(NSRect)drawTitle:(NSAttributedString *)title withFrame:(NSRect)frame inView:(NSView *)controlView
{
    CGSize cs = controlView.bounds.size;
    CGPoint or = frame.origin;
    CGSize fs = frame.size;
    const int th = fs.height;
    const int inset = th * 2 / 3;
    const int indent = self.image ? th+6 : 0; // assuming the img is on the left of the text, we'll indent the text
    frame = CGRectMake (inset+indent, or.y, cs.width-2*inset-indent, fs.height);
    return [super drawTitle:title withFrame:frame inView:controlView];
}

@end

Примечание. Этот код не охватывает все возможные случаи добавления значка к элементам меню — он обрабатывает только наиболее распространенный случай наличия подходящего значка слева, и это все еще немного шатко из-за использования значений отступа, которые я нашел в ходе пробной версии. -и-ошибка. Отрегулируйте их самостоятельно по мере необходимости.

См. Также комментарий @NSGod ниже о настройке класса ячейки в перо или раскадровке.

Обновление: Оптимизирован код, чтобы он нуждался только в подклассе NSPopUpButtonCell, но не в NSPopUpButton, благодаря @NSGod.

Обновление 2: вместо реализации drawTitleWithFrame:inView: теперь я перезаписываю drawTitle:withFrame:inView:, потому что это дает мне правильно центрированный кадр для рисования и делает весь код короче.

person Thomas Tempelmann    schedule 24.05.2016
comment
Вы должны иметь возможность установить собственное имя класса NSPopUpButtonCell внутри файла пера. Выберите NSPopUpButton в файле пера, затем щелкните еще раз, чтобы выбрать ячейку (убедитесь, что ячейка выбрана с помощью представления схемы иерархии пера слева). В инспекторе удостоверений установите для пользовательского класса значение MyCell. Затем вы можете настроить все свойства ячейки, и они должны быть сохранены. Когда nib загружается, это вызовет метод initWithCoder: MyCell, поэтому, если вы его переопределили, обязательно вызовите [super initWithCoder:coder] перед любой настройкой.... - person NSGod; 24.05.2016
comment
@NSGod Я никогда раньше не замечал, что второй щелчок выделяет ячейку, хотя я заметил, что что-то изменилось. Теперь единственное, что осталось выяснить, это правильно центрировать текст по вертикали, хотя это должно быть легко. Теоретически. - person Thomas Tempelmann; 24.05.2016