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