Как нарисовать выделенное изображение NSPopupButtonCell

У меня есть NSPopupButton внутри NSToolbar, у которого есть borderder = false, у которого есть некоторая смесь цветов при выделении. Если я использую bordered = true, изображение рисуется с красивым темным наложением.

Я пытаюсь добиться того, чтобы рисовать выделенное состояние так же, как в bordered=true

PS: NSButtonCell с bordered = false работает из коробки.

Я могу добиться такого поведения, имея bordered = true и переопределив drawBezel, и ничего там не делать, но я хочу знать

Что я пробовал:

  • основные моментыПо
  • интерьерФонСтиль
  • setCellAttribute

-

class ToolbarPopUpButtonCell : NSPopUpButtonCell {

  override var isHighlighted: Bool {
      get { return true }
      set { super.isHighlighted = newValue }
  }   

  override func drawImage(withFrame cellFrame: NSRect, in controlView: NSView) {
      super.drawImage(withFrame: cellFrame, in: controlView)
  }


  //used in case bordered = true so we do nothing
  override func drawBezel(withFrame frame: NSRect, in controlView: NSView) {

  }

  //doesn't work
  override var interiorBackgroundStyle: NSView.BackgroundStyle
      {
      return .raised
  }
}

  class ToolbarPopUpButton: NSPopUpButton {

  override func awakeFromNib() {
      cell?.setCellAttribute(.cellLightsByBackground, to: 1)
  }

  override var intrinsicContentSize: NSSize {
      return NSMakeSize(32 + 5, 32)
  }
}

Обратите внимание на изображение справа, которое подходит для bordered = false (NSButtonCell)

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


person Marek H    schedule 23.04.2020    source источник


Ответы (1)


Единственный лайфхак, который я нашел, это нарисовать замещающую ячейку. Все еще ищет лучшее решение.

- (void)drawImageWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
    NSImage *image = [self image];
    NSButtonCell *swapCell = [[NSButtonCell alloc] initImageCell:image];
    [swapCell setHighlighted:[self isHighlighted]];
    [swapCell drawImage:image withFrame:cellFrame inView:controlView];
}
person Marek H    schedule 23.04.2020