Подсветка NSButtonCell остается при нажатии клавиш в Мохаве - PullRequest
0 голосов
/ 22 октября 2018

У меня есть класс, полученный из NSButtonCell, где я рисую рамку:

override func drawBezel(withFrame frame: NSRect, in controlView: NSView) {
        let path = NSBezierPath(bound: frame.insetBy(dx: CGFloat(config.buttonInset), dy: CGFloat(config.buttonInset)), withCorners: corners, withRadius: CGFloat(config.cornerRadius), flip: flipIt)

        path.lineWidth = config.borderWidth
        if(isEnabled)
        {
            if(isHighlighted)
            {
                print("isHighlighted true")
                let fillColor: NSColor = colorMap.buttonHighlightColor
                let strokeColor: NSColor = colorMap.buttonBorderColor
                fillColor.setFill()
                strokeColor.setStroke()
                path.fill()
                path.stroke()
            }
            else
            {
                print("isHighlighted false")
                if(showsStateBy.contains(.changeGrayCellMask))
                {
                    print(".changeGrayCellMask")
                    if(state == .on)
                    {
                        print(".on")
                        let fillColor: NSColor = colorMap.buttonOnColor
                        let strokeColor: NSColor = colorMap.buttonBorderColor
                        fillColor.setFill()
                        strokeColor.setStroke()
                        path.fill()
                        path.stroke()
                    }
                    else
                    {
                        print(".off")
                        let fillColor: NSColor = colorMap.buttonBackgroundColor
                        let strokeColor: NSColor = colorMap.buttonBorderColor
                        fillColor.setFill()
                        strokeColor.setStroke()
                        path.fill()
                        path.stroke()
                    }
                }
                else
                {
                    print("!.changeGrayCellMask")
                    let fillColor: NSColor = colorMap.buttonBackgroundColor
                    let strokeColor: NSColor = colorMap.buttonBorderColor
                    fillColor.setFill()
                    strokeColor.setStroke()
                    path.fill()
                    path.stroke()
                }
            }
        }
        else
        {
            let fillColor: NSColor = colorMap.buttonBackgroundDisabledColor
            let strokeColor: NSColor = colorMap.buttonBorderColor
            fillColor.setFill()
            strokeColor.setStroke()
            path.fill()
            path.stroke()
        }
    }

Кроме того, мне присвоено keyEquivalent кнопке с моей пользовательской ячейкой.

Это прекрасно работает при использовании щелчка мыши или нажатия клавиши на macOS High Sierra .Подсветка отображается только тогда, когда мышь или клавиша не работают.

Вывод журнала выглядит следующим образом:

**after click with mouse**
isHighlighted true
isHighlighted false
!.changeGrayCellMask

**after shortcut key**
isHighlighted true
isHighlighted false
!.changeGrayCellMask

Однако на Мохаве поведение при нажатии клавиш отличается,После нажатия клавиши выделенное состояние сохраняется, в то время как при использовании мыши выделение работает, как и ожидалось.

Вывод журнала из Мохаве:

**Mojave click with mouse**
isHighlighted true
isHighlighted false
!.changeGrayCellMask

**Mojave after shortcut key**
isHighlighted false
!.changeGrayCellMask
isHighlighted true <----- this is odd

Итак, есть ли что-то, что было изменено в Мохаве.Как видите, drawBezel порядок звонков совершенно неожидан.Странная вещь, почему это происходит только при использовании клавиатуры.

Как добиться поведения подсветки кнопок с помощью клавиатуры, аналогичной щелчку мышью по Мохаве?

ОБНОВЛЕНИЕ

Мне удалось создать минимальный проект в XCode Playground, демонстрирующий проблему.Вы можете скачать его здесь

1 Ответ

0 голосов
/ 15 февраля 2019

Внутри действия:

[button display]; 

Это может быть не элегантным решением.Но это работает для меня.

...