2013-10-11 45 views
0

我有一個NSScrollView,它被設置爲通過單擊IB中的滾動視圖上的圖層複選標記來支持圖層。在那個scrollview中我有一個NSTableView。在那個NSTableView中,我使用自定義的NSTableRowView在我的列之間的分隔符處繪製垂直的紅線。我的NSTableView有2列。將我的scrollview設置爲圖層後備,無論何時拖動列分隔線以使列變寬或變窄,drawBackgroundInRect都不會被調用,因此我的背景垂直線在拖動操作期間不會更新。drawBackgroundInRect在圖層背景視圖中未調用

是否有解決方法?

下面是我使用的drawBackgroundInRect代碼:

- (void)drawBackgroundInRect:(NSRect)dirtyRect { 

[super drawBackgroundInRect:dirtyRect]; 

NSGraphicsContext *nscontext = [NSGraphicsContext currentContext]; 

[nscontext saveGraphicsState]; 

CGContextRef context = (CGContextRef)[nscontext graphicsPort]; 

if (!self.isGroupRowStyle) { 

    CGRect leftColumnRect = [(NSView *)[self viewAtColumn:0] frame]; 
    leftColumnRect.origin.y -= 1.0; 
    leftColumnRect.size.height += 2.0; 
    leftColumnRect.size.width += 1.0; 

    // grey background 

    CGContextSetGrayFillColor(context, 0.98, 1.0); 
    CGContextFillRect(context, leftColumnRect); 

    // draw nice red vertical line 

    CGContextBeginPath(context); 
    CGContextSetRGBStrokeColor(context, 0.6, 0.2, 0.2, 0.3); 

    CGContextMoveToPoint(context, leftColumnRect.size.width + 1.5, 0); 
    CGContextSetLineWidth(context, 1.0); 
    CGContextAddLineToPoint(context, leftColumnRect.size.width + 1.5, leftColumnRect.size.height); 
    CGContextStrokePath(context); 

} 
[nscontext restoreGraphicsState]; 
} 

這裏的調整列時,我發現了問題:

enter image description here

,這是它應該是什麼就像我沒有將我的滾動視圖設爲圖層支持時一樣:

enter image description here

謝謝!

回答

0

經過一年多的時間,我終於想出了一個適合自己的問題的正確答案。

訣竅是在NSTableColumn被調整大小時,在可見行列表中的每一行上調用setNeedsDisplay。

下面是我在NSViewController子類中使用代碼:

- (void)tableView:(NSTableView *)tableView isResizingTableColumn:(NSTableColumn *)tableColumn { 
    NSRange range = [tableView rowsInRect:tableView.visibleRect]; 
    for (NSInteger row = range.location; row < (range.location + range.length); row++) { 
     NSTableRowView *rowView = [tableView rowViewAtRow:row makeIfNecessary:NO]; 
     [rowView setNeedsDisplay:YES]; 
    } 
} 

我NSTableView的有它的頭查看自己的NSTableHeaderView的子類。我將我的NSViewController設置爲標題視圖的代理,以便跟蹤用戶調整大小的時間。

TFRecordTableHeaderView.h:

#import <Cocoa/Cocoa.h> 

@protocol TFRecordTableHeaderViewDelegate <NSObject> 
- (void)tableView:(NSTableView *)tableView isResizingTableColumn:(NSTableColumn *)tableColumn; 
@end 

@interface TFRecordTableHeaderView : NSTableHeaderView 
@property (nonatomic, assign) id<TFRecordTableHeaderViewDelegate>delegate; 
@end 

TFRecordTableHeaderView.m:

#import "TFRecordTableHeaderView.h" 

@implementation TFRecordTableHeaderView 

- (id)initWithFrame:(NSRect)frame { 
    self = [super initWithFrame:frame]; 

    if (self) { 
     // Initialization code here. 
    } 

    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect { 
    [super drawRect:dirtyRect]; 
    // do some custom drawing here 
} 

// track resizing of the column as it happens 
// from the docs: If the user is resizing a column in the receiver, returns the index of that column. 

- (NSInteger)resizedColumn { 
    NSInteger columnIndex = [super resizedColumn]; 

    if (columnIndex >= 0) { 
     NSTableColumn *column = [self.tableView.tableColumns objectAtIndex:columnIndex]; 

     if ([self.delegate respondsToSelector:@selector(tableView:isResizingTableColumn:)]) { 
      [self.delegate tableView:self.tableView isResizingTableColumn:column]; 
     } 
    } 

    return columnIndex; 
} 

@end 

只需設置NSTableHeaderView子類的NSTableView的的頭視圖。現在,只要您在標題中拖動一列,就會調用isResizingTableColumn委託方法。你可以在你的NSViewController子類上實現isResizingTableColumn。

現在,當您調整列的大小時,將調用isResizingTableColumn,它將爲可見矩形獲取NSTableRowViews,併發送setNeedsDisplay。這將導致刷新行,並在拖動時調用drawBackgroundInRect方法。這反過來將刷新我的自定義垂直網格線。

所有這些都是爲了避免在NSTableView的頂部分組行上繪製垂直網格線。我認爲這應該內置到NSTableView。如果您的小組章節標題中包含文本,並且在文本上方有一個垂直網格線,它看起來非常糟糕。

現在我想想,你可能只是這樣做就在您的NSTableHeaderView子類:

- (NSInteger)resizedColumn { 
    NSInteger columnIndex = [super resizedColumn]; 

    if (columnIndex >= 0) {   
     NSRange range = [self.tableView rowsInRect:self.tableView.visibleRect]; 
     for (NSInteger row = range.location; row < (range.location + range.length); row++) { 
      NSTableRowView *rowView = [self.tableView rowViewAtRow:row makeIfNecessary:NO]; 
      [rowView setNeedsDisplay:YES]; 
     } 
    } 

    return columnIndex; 
} 

在我來說,我是這樣做對我的NSViewController子類,因爲當我調整一個表列我也是重新調整另一個平等。這是使用另一個類似配置的表格來模擬頁腳行,因爲NSTableView沒有像UITableView那樣的頁腳概念。