Swift 如何更改NSSegmentedControl按钮的选择颜色

Swift 如何更改NSSegmentedControl按钮的选择颜色,swift,xcode,macos,nssegmentedcontrol,Swift,Xcode,Macos,Nssegmentedcontrol,我试图找到一种方法来改变所选控件按钮的颜色。通过将NSSegmentedControl或NSSegmentedCell子类化或任何其他方式是否可以实现这一点?如果是的话,有人能给我指路吗 您需要将NSSegmentedCell子类化并覆盖以下方法: - (NSColor *)highlightColorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView 从文件中: 返回接收器在绘制选择高光时使用的颜色 您不应假设单元格一定要使用se

我试图找到一种方法来改变所选控件按钮的颜色。通过将NSSegmentedControl或NSSegmentedCell子类化或任何其他方式是否可以实现这一点?如果是的话,有人能给我指路吗

您需要将NSSegmentedCell子类化并覆盖以下方法:

- (NSColor *)highlightColorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
从文件中:

返回接收器在绘制选择高光时使用的颜色

您不应假设单元格一定要使用selectedControlColor返回的值绘制自身。单元格可能希望根据控件视图的键状态等情况使用不同的选择高亮显示颜色绘制


您可以子类NSSegmentedCell e覆盖drawSegment方法:

override func drawSegment(_ segment: Int, inFrame frame: NSRect, with controlView: NSView) {
    var color: NSColor
    if selectedSegment == segment {
        color = NSColor.red
    } else {
        color = NSColor.white
    }
    color.setFill()
    frame.fill()
    super.drawSegment(segment, inFrame: frame, with: controlView)
}

我用了不同的方法,没有覆盖,只是使用了“假颜色”过滤器。它不是完美的,因为它在某种程度上改变了一点透明的颜色,但对我来说还可以

class RLSegmentedControl: NSSegmentedControl {
init() {
    super.init(frame: NSZeroRect)
    addFilter()
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    addFilter()
}

func addFilter() {
    let colorFilter = CIFilter(name: "CIFalseColor")!
    colorFilter.setDefaults()
    colorFilter.setValue(CIColor(cgColor: NSColor.white.cgColor), forKey: "inputColor0")
    colorFilter.setValue(CIColor(cgColor: NSColor.black.cgColor), forKey: "inputColor1")

//        colorFilter.setValue(CIColor(cgColor: NSColor.yellow.cgColor), forKey: "inputColor0")
//        colorFilter.setValue(CIColor(cgColor: NSColor.black.cgColor), forKey: "inputColor1")

    self.contentFilters = [colorFilter]
}
}

我以前试过这个。在NSSegmentedCell中从未调用此NSCell方法,文档中也有说明“您不应假设单元格一定要使用selectedControlColor返回的值绘制自身。单元格可能希望根据控件视图的键状态等情况使用不同的选择高亮显示颜色绘制。“我会为此提交一份bug报告。文档中说,您可以使用此方法来更改高光颜色,但没有说明没有使用此方法。唯一的解决方案似乎是覆盖-drawInteriorWithFrame:inView:并自己处理所有图形。在文档中没有看到此方法:@wcochran它是NSCell的一个方法,它是NSSegmentedCell超类的超类:在某些段单元格上工作,但在我的例子中,一半的单元格的边框宽度只有它应该的一半(整个单元格没有填充)。