2011-12-28 39 views
6

Tôi có màu hàng thay thế tùy chỉnh trong NSTableView dựa trên chế độ xem của tôi bằng cách ghi đè NSTableRowView 's -drawBackgroundInRect:. Điều này làm việc cho hầu hết các phần trong đó màu sắc của chính các tế bào thay đổi, nhưng rõ ràng là nó không ảnh hưởng đến nền của chính chế độ xem bảng (ví dụ: khi chế độ xem cuộn bị trả về). Ảnh chụp màn hình:Nền tùy chỉnh trong NSTableView dựa trên chế độ xem

NSTableView background

cách tốt nhất để tùy chỉnh này là gì? Tôi posted a question trước đó về vấn đề này rất giống nhau nhưng với lượt xem dựa trên ô dựa trên. Giải pháp tôi tìm thấy dường như không hoạt động với chế độ xem bảng dựa trên chế độ xem.

+0

Bạn có muốn nền được xen kẽ quá? – lbrndnr

+0

Có, với cùng màu mà tôi đang sử dụng cho các ô – indragie

+0

Tại sao bạn không thử sao chép các hàng trống trong drawBackgroundInClipRect? NSTableView cũng vẽ nó theo phương pháp này và nó có vẻ không khó. – lbrndnr

Trả lời

3

Các bạn đã thử trọng NSTableView của drawBackgroundInClipRect:(NSRect)clipRect

-1

Tôi không thử nó nhưng những gì sẽ xảy ra nếu bạn chỉ cần ghi đè -drawRect:?

+2

-drawRect: không có nghĩa là bị ghi đè trong lớp con NSTableView, điều này có khả năng mang lại kết quả không mong muốn. – indragie

2

Có video về cuộc nói chuyện "Xem cơ bản về NSTableView cơ bản đến nâng cao" (có sẵn here) trong đó nền bên dưới dòng cuối cùng được vẽ.

Để mở rộng kỹ thuật mà bạn có thể tạo một lớp con của NSTableView và thêm một mã nhỏ:

// somewhere in your setup code (colors just intended as examples): 

tableView.colors = [NSArray arrayWithObjects: [NSColor lightGrayColor],[NSColor grayColor], nil]; 


// In the table view subclass: 

-(void)drawBackgroundInClipRect:(NSRect)clipRect 
{ 
    // The super class implementation obviously does something more 
    // than just drawing the striped background, because 
    // if you leave this out it looks funny 
    [super drawBackgroundInClipRect:clipRect]; 

    NSRect boundsToDraw = clipRect; 

    CGFloat yStart = 0; 
    NSInteger rowIndex = -1; 

    if (clipRect.origin.y < 0) {   

     while (yStart > NSMinY(boundsToDraw)) { 

      CGFloat yRowTop = yStart - self.rowHeight; 

      NSRect rowFrame = NSMakeRect(0, yRowTop, boundsToDraw.size.width, self.rowHeight); 

      NSUInteger colorIndex = rowIndex % self.colors.count; 

      NSColor *color = [self.colors objectAtIndex:colorIndex]; 

      [color set]; 

      NSRectFill(rowFrame); 

      yStart -= self.rowHeight; 

      rowIndex--; 
     } 
    } 
} 
Các vấn đề liên quan