NSPopUpButton, NSComboBox аналогичное меню - PullRequest
0 голосов
/ 06 сентября 2011

Я пытаюсь создать меню с выпадающим меню с настраиваемым фоном для каждой ячейки.Сначала я попытался адаптировать NSPopUpButton, но не смог найти способ изменить фоновое изображение ячеек.Использование setImage: сдвинет текст справа от фона.Затем я остановился на NSComboBox, но не смог найти способ изменить кнопку со стрелкой.Может кто-нибудь, пожалуйста, помогите с идеей?Следующим шагом будет создание собственного контроллера, но я хотел бы использовать что-то уже сделанное.

Ответы [ 2 ]

4 голосов
/ 21 января 2012

Чтобы настроить кнопку со стрелкой в ​​NSComboBox, вам нужно создать подкласс NSComboBoxCell и настроить поле со списком для использования этой ячейки. Если вы настроили свой контроль в IB, вы можете легко изменить класс своей ячейки там. Если вы программно создаете поле со списком, создайте подкласс NSComboBox, переопределите + (Class)cellClass и верните свой пользовательский подкласс NSComboBoxCell из этого метода.

Теперь для рисования. В вашем подклассе NSComboBoxCell вам необходимо переопределить - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView.

(я пытался переопределить - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView, но рамка ячейки, которую он предоставляет, останавливается за исключением рисования фактической области кнопки, т. Е. Охватывает только область ввода текста.)

Ваш кастом - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView должен выглядеть примерно так:

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
    [super drawWithFrame:cellFrame inView:controlView];

    // Constrain to the far right of the provided frame to draw the button
    NSRect bounds = NSMakeRect(cellFrame.origin.x + cellFrame.size.width - cellFrame.size.height, cellFrame.origin.y, cellFrame.size.height, cellFrame.size.height);

    // Draw your custom button inside the bounds rect
}
1 голос
/ 22 марта 2013

Я не уверен, правильно ли я понял ваш вопрос. Если вы хотите показать меню в произвольной позиции где-то в вашем пользовательском интерфейсе: NSMenu предоставляет удобные методы для достижения этого. Посмотрите документацию для + popUpContextMenu:withEvent:forView:, + popUpContextMenu:withEvent:forView:withFont: и – popUpMenuPositioningItem:atLocation:inView:, чтобы найти тот, который наилучшим образом соответствует вашим потребностям. Таким образом, вы можете отображать меню в любом удобном для вас месте.

Если вы вместо этого хотите отобразить произвольное содержимое внутри меню, посмотрите документацию NSMenuItem - setView:. Это позволяет вам вставлять представления в меню. Вместе с вышеописанным способом отображения меню, где вы хотите, вы можете создавать всевозможные решения для нужд «PopOver».

...