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

时间:2017-05-17 21:11:00

标签: swift xcode macos nssegmentedcontrol

我正在尝试找到一种方法来更改所选控制按钮的颜色。这可能通过继承NSSegmentedControl或NSSegmentedCell或任何其他方式吗?如果是这样,有人可以指路吗?

3 个答案:

答案 0 :(得分:0)

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

- (NSColor *)highlightColorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView

来自文档:

  

返回绘制选择突出显示时接收器使用的颜色。

     

您不应该假设单元格必须使用selectedControlColor返回的值绘制自己。单元格可能希望使用不同的选择突出显示颜色,具体取决于其controlView的键状态。

答案 1 :(得分:0)

您可以继承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)
}

答案 2 :(得分:0)

我以不同的方式做到了这一点,没有覆盖,只是使用了“假色”滤镜。这并不完美,因为它会以某种方式改变颜色的透明度,但是对我来说还可以。

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]
}
}

enter image description here