Настройка NSButtonCell с изображениями и подсветкой - PullRequest
6 голосов
/ 05 августа 2011

Я хочу создать пользовательский переключатель для своего приложения, в котором я предоставляю три изображения для возможных состояний (вкл, выкл, mousedown). Весь внешний вид содержится на изображениях, поэтому я не хочу, чтобы Cocoa выделяла (затемняла) кнопку сама во время mousedown.

В данный момент я создал подкласс NSButtonCell, перетащил кнопку скоса NSButtonTypeMomentaryChange в свое представление и настроил тип класса ячейки кнопки для моего подкласса. Подкласс просто реализует awakeFromNib, чтобы попытаться установить желаемое поведение:

- (void)awakeFromNib
{
    [self setShowsStateBy:NSContentsCellMask];
    [self setHighlightsBy:NSContentsCellMask];
}

, который я думал (в соответствии с документацией) отключил бы затемнение кнопки mousedown. Это не так.

Я стою здесь, и теперь у меня есть два вопроса:

  • Как настроить класс ButtonCell таким образом, чтобы он отображал мою готовую картинку в mousedown и не затемнял / не рисовал границы вокруг кнопки?
  • Каким был бы самый чистый / наиболее подходящий способ реализовать другое поведение переключателя, то есть показать положение включения / выключения в зависимости от предыдущего состояния и иметь возможность правильно сообщать свое состояние другим объектам?

1 Ответ

6 голосов
/ 05 августа 2011

Установите тип кнопки вкл / выкл.Подкласс его ячейка.Напишите это двумя способами:

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
    if ([self state])
    {
        [onStateImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
    }
    else
    {
        [offStateImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
    }
} 
- (void)highlight:(BOOL)flag withFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
    if (flag){
        [downStateImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...