Настройка NSButtonCell с изображениями и подсветкой

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

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

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

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

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

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

1 ответов


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

- (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];

    }
}