2012-03-31 18 views
7

Tôi muốn có một lớp con của NSSegmentedControl, nơi các phân đoạn khác nhau có màu sắc khác nhau. Tôi đã thử subclassing NSSegmentedControl và thêm đoạn mã sau:NSSegmentedControl Colors

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

enter image description here

Điều đó có vẻ gần ngoại trừ việc nó 1. màu sắc toàn bộ phân đoạn kiểm soát cùng một màu sắc, màu đỏ trong trường hợp này, và 2. có một chút màu bị chảy máu trên các cạnh.

Tôi cũng đã cố gắng subclassing NSSegmentedCell và thêm này:

- (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

này là tốt hơn trong đó các phân khúc khác nhau được hiển thị màu sắc độc đáo, tuy nhiên tôi sẽ hầu như không xem xét có thể chấp nhận này. Tôi muốn toàn bộ phân đoạn được điền vào với màu phù hợp cho phân đoạn đó và nó sẽ rất tuyệt nếu nó có độ dốc và tô bóng như trong ảnh chụp màn hình đầu tiên.

Vui lòng cho tôi biết cách tôi có thể đạt được điều này.

Cảm ơn.

+0

Bạn may mắn rằng việc thực hiện kiểm soát phân đoạn hiện tại sử dụng tính mờ trong bản vẽ của nó. Điều này cho phép màu đỏ mà bạn đang vẽ bên dưới sự kiểm soát để tỏa sáng. Điều đó có thể thay đổi với bất kỳ cập nhật nào đối với Mac OS X. Để làm điều này một cách chính xác, nên tạo lớp con NSView của riêng bạn thực hiện tất cả các bản vẽ trong drawRect: thay vì cố gắng kiểm soát hiện tại. –

+0

Ồ, Jon, có thể liên quan đến những gì bạn đang nói, có khoảng nửa tá phong cách khác nhau. Tôi tự hỏi làm thế nào các phong cách khác cũng có thể ảnh hưởng đến điều này. –

Trả lời

4

Bạn cần xác định chiều rộng cố định cho phân khúc.

enter image description here

Sau đó, mã của bạn sẽ làm việc khá tốt (Ảnh chụp màn hình là từ dự án thử nghiệm của tôi)

enter image description here

Và đừng quên để vô hiệu hóa màu

[self.segment.cell setControlTint:NSClearControlTint ]; 
Các vấn đề liên quan