NSButtonCell高亮显示仍在Mojave的按键上

时间:2018-10-22 07:39:31

标签: swift macos nsbutton macos-mojave nsbuttoncell

我有一个源自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中创建最小的项目来演示该问题。您可以下载here

1 个答案:

答案 0 :(得分:1)

操作内:

[button display]; 

这可能不是一个很优雅的解决方案。但这对我有用。