11

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では、キーを押したときの動作が異なります。キーを押した後、強調表示された状態が維持されますが、マウスを使用すると、強調表示が期待どおりに機能します。

Mojave からのログ出力:

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

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

Mojaveで変更されたものはありますか。ご覧のとおり、drawBezel呼び出し順序はまったく予想外です。奇妙なことは、キーボードを使用しているときにのみ発生する理由です。

Mojaveでのマウスクリックに似たキーボードでボタンのハイライト動作を実現するにはどうすればよいですか?

アップデート

問題を示すXCode Playgroundで最小限のプロジェクトを作成できました。ここからダウンロードできます

4

1 に答える 1

1

アクションの内部:

[button display]; 

これは非エレガントなソリューションになる可能性があります。しかし、それは私にとってはうまくいきます。

于 2019-02-15T16:09:39.407 に答える