Objective c 在图层备份视图中未调用DruckGroundInRect

Objective c 在图层备份视图中未调用DruckGroundInRect,objective-c,layer,appkit,nsscrollview,Objective C,Layer,Appkit,Nsscrollview,我有一个NSScrollView,通过单击IB中scrollview上的layer复选标记将其设置为layer backed。在该scrollview中,我有一个NSTableView。在该NSTableView中,我使用自定义NSTableRowView在列之间的分隔符处绘制一条垂直红线。我的NSTableView有两列。当我的scrollview设置为layer backed时,每当我拖动列分隔符使列变宽或变窄时,不会调用DruckGroundInRect,因此在拖动操作期间不会更新背景垂直

我有一个NSScrollView,通过单击IB中scrollview上的layer复选标记将其设置为layer backed。在该scrollview中,我有一个NSTableView。在该NSTableView中,我使用自定义NSTableRowView在列之间的分隔符处绘制一条垂直红线。我的NSTableView有两列。当我的scrollview设置为layer backed时,每当我拖动列分隔符使列变宽或变窄时,不会调用DruckGroundInRect,因此在拖动操作期间不会更新背景垂直线

有解决办法吗

以下是我在DruckGroundInRect中使用的代码:

- (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];
}
以下是我在调整列大小时遇到的问题:

当我没有将scrollview设置为层备份时,它应该是这样的:


谢谢

一年多之后,我终于找到了自己问题的正确答案

技巧是在调整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];
    }
}
- (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;
}
只需将NSTableHeaderView子类设置为NSTableView的头视图。现在,无论何时在标题中拖动列,都将调用isResizingTableColumn委托方法。您可以在NSViewController子类上实现IsResisingTable列

现在,当您调整列的大小时,将调用isResisingTableColumn,它将获取可见矩形的NSTableRowViews,并将发送setNeedsDisplay。这将导致行被刷新,并且在拖动时调用trackgroundinrect方法。这反过来将刷新我的自定义垂直网格线

所有这些都是为了避免在NSTableView上的顶部分组行上绘制垂直网格线。我认为这应该内置到NSTableView中。如果您的组分区标题中包含文本,并且文本上方有一条垂直网格线,则看起来非常糟糕

现在我想了想,您可以在NSTableHeaderView子类上正确地执行此操作:

- (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];
    }
}
- (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;
}
-(NSInteger)调整大小的列{
NSInteger columnIndex=[super resizedColumn];
如果(columnIndex>=0){
NSRange range=[self.tableView行直接:self.tableView.visibleRect];
对于(NSInteger行=range.location;行<(range.location+range.length);行++){
NSTableRowView*rowView=[self.tableView rowViewAtRow:row MakeIfRequired:NO];
[行视图设置需要显示:是];
}
}
返回列索引;
}
在我的例子中,我是在我的NSViewController子类上这样做的,因为当我调整一个表列的大小时,我也同样调整了另一个表列的大小。这是用另一个配置类似的表模拟一个页脚行,该表中只有一行,因为NSTableView不像UITableView那样具有页脚的概念