我该如何在NSTableView中仅为已填充行绘制网格线?当我将网格样式掩码设置为NSTableViewSolidHorizontalGridStyleMask时,它会为所有行绘制网格线,无论是否有数据。
我正在寻找一些示例代码来实现这一点。
我该如何在NSTableView中仅为已填充行绘制网格线?当我将网格样式掩码设置为NSTableViewSolidHorizontalGridStyleMask时,它会为所有行绘制网格线,无论是否有数据。
我正在寻找一些示例代码来实现这一点。
我发现以下代码对我最有效。只需欺骗原始网格绘制代码,使其仅在填充的行上进行绘制。
如有需要,请子类化NSTableView并覆盖drawGridInClipRect:(NSRect)clipRect方法,具体如下:
- (void)drawGridInClipRect:(NSRect)clipRect
{
NSRect lastRowRect = [self rectOfRow:[self numberOfRows]-1];
NSRect myClipRect = NSMakeRect(0, 0, lastRowRect.size.width, NSMaxY(lastRowRect));
NSRect finalClipRect = NSIntersectionRect(clipRect, myClipRect);
[super drawGridInClipRect:finalClipRect];
}
在Swift 3.1中,这就是你所需要的:
import Cocoa
class GridClipTableView: NSTableView {
override func drawGrid(inClipRect clipRect: NSRect) { }
}
drawGridInClipRect:
方法并使用空方法,只会绘制网格项。 - AlessandroNSTableView
进行子类化并重写 drawRow:clipRect:
。另一个可能的选择是覆盖 drawGridInClipRect:
,但那会更加麻烦,因为你需要手动挑选出行。
这应该能帮助你朝着正确的方向前进:
- (void)drawRow:(NSInteger)rowIndex clipRect:(NSRect)clipRect {
// First do the default drawing
[super drawRow:rowIndex clipRect:clipRect];
// Check if there's content in any of the cells in this row
BOOL doesHaveContent = NO;
int numCols = [self numberOfColumns];
int colIndex;
for( colIndex = 0; colIndex < numCols; colIndex++ ){
NSCell * cell = [self preparedCellAtColumn:colIndex
row:rowIndex];
if( [cell objectValue] != nil ){
doesHaveContent = YES;
break;
}
}
if( doesHaveContent ){
NSRect rowRect = [self rectOfRow:rowIndex];
NSBezierPath * gridPath = [NSBezierPath bezierPath];
// Ignoring clipRect because this isn't a lot of drawing
[gridPath moveToPoint:rowRect.origin];
[gridPath lineToPoint:NSMakePoint(rowRect.origin.x + rowRect.size.width,
rowRect.origin.y)];
[gridPath moveToPoint:NSMakePoint(rowRect.origin.x,
rowRect.origin.y + rowRect.size.height)];
[gridPath lineToPoint:NSMakePoint(rowRect.origin.x + rowRect.size.width,
rowRect.origin.y + rowRect.size.height)];
[myGridColor set];
[gridPath stroke];
// You could also just do:
// [myGridColor set];
// [[NSBezierPath bezierPathWithRect:rowRect] stroke];
}
}
NSCell
;如果每个单元格都有内容,那么每个单元格都可以在其周围绘制特殊边框。但是,如果有一些单元格为空,则不会在整行上绘制一条线。这里列出的两种解决方法都不适用于我,不知道为什么。我所做的是:
NSTableView
并重写rectOfColumn:
(见下文)。这在我的测试中从macOS 10.9到10.15都有效。
- (NSRect)rectOfColumn:(NSInteger)column
{
NSRect value = [super rectOfColumn:column];
NSInteger numberOfRows = [self numberOfRows];
if (numberOfRows == 0) {
value.size.height = 0;
} else {
NSRect firstRect = [self rectOfRow:0];
NSRect lastRect = [self rectOfRow:numberOfRows - 1];
value.size.height = NSMaxY(lastRect) - NSMinY(firstRect);
}
return value;
}
NSRect lastColumnRect = [self rectOfColumn:self.numberOfColumns - 1]; NSRect finalClipRect = NSMakeRect(0, 0, NSMaxX(lastColumnRect), NSMaxY(lastRowRect));
- Lukáš Kubánek