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で最小限のプロジェクトを作成できました。ここからダウンロードできます