3

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

4

3 回答 3

3

我以不同的方式完成了它,没有覆盖,只是使用“假色”过滤器。它并不完美,因为它会以某种方式改变颜色的透明性,但对我来说还可以。

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

在此处输入图像描述

于 2018-09-18T14:23:21.010 回答
1

您可以继承 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)
}
于 2018-03-08T18:17:20.370 回答
0

您需要继承 NSSegmentedCell 并覆盖以下方法:

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

从文档中:

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

您不应该假设一个单元格一定要使用从 selectedControlColor 返回的值来绘制自己。一个单元格可能希望根据其 controlView 的关键状态等内容使用不同的选择突出显示颜色进行绘制。

于 2017-05-18T14:27:21.887 回答