objective-c - NSSegmentedControl 颜色

标签 objective-c macos cocoa user-interface

我想要一个 NSSegmentedControl 的子类,其中各个段的颜色不同。我已经尝试子类化 NSSegmentedControl 并添加以下代码:

- (void)drawRect:(NSRect)dirtyRect
{
    NSColor *color = [NSColor redColor];
    [color setFill];
    NSRectFill(dirtyRect);
    [super drawRect:dirtyRect];
}

enter image description here

这看起来很接近,除了 1. 它将整个分段控件着色为相同的颜色,在本例中为红色,以及 2. 边缘有一点颜色溢出。

我还尝试继承 NSSegmentedCell 并添加:

- (void)drawSegment:(NSInteger)segment inFrame:(NSRect)frame withView:(NSView *)controlView
{
    NSColor *color;
    switch (segment) {
        case 0:
            color = [NSColor redColor];
            break;
        case 1:
            color = [NSColor blueColor];
            break;
        case 2:
            color = [NSColor greenColor];
            break;
        case 3:
            color = [NSColor orangeColor];
            break;
        default:
            break;
    }
    [color setFill];
    NSRectFill(frame);
    [super drawSegment:segment inFrame:frame withView:controlView];
}

enter image description here

这更好,因为各个部分都显示了独特的颜色,但我几乎不认为这是可以接受的。我希望整个片段都用适合该片段的颜色填充,如果它具有第一个屏幕截图中的渐变和阴影,那就太好了。

请告诉我如何实现这一目标。

谢谢。

最佳答案

您需要为段指定固定宽度。

enter image description here

那么你的代码将工作得很好(屏幕截图来 self 的测试项目)

enter image description here

不要忘记禁用色调

 [self.segment.cell setControlTint:NSClearControlTint ];

关于objective-c - NSSegmentedControl 颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9952308/

相关文章:

ios - 如果在初始化程序中创建对象会立即释放,但如果在方法中创建则不会

objective-c - iOS 6 上的 XMPP 类中的警告

iphone - HTTP连接的 'didReceiveData'方法的讨论

Cocoa 应用程序引导问题

macos - 为 Cocoa 寻找类似电子表格的控件

objective-c - NSCollectionView 中的 NSPopover(或不)

ios - 将 UIImageView 从 A 移动到 B

objective-c - 带有部分的基于 View 的 NSTableView

c++ - 用于创建/注册虚拟存储设备的 IOKit 驱动程序

objective-c - 在应用程序启动时设置带有复选框的 BOOL 值?