选择行更改时,NSTableView奇怪显示错误

时间:2015-04-10 21:48:27

标签: cocoa nstableview

我发现了一个奇怪的绘图错误。我有一个基于NSTableView的视图,带有简单的行或文本单元格。当我按下向下箭头,选择一行时,tableview中的所有文本都向左移动1个像素,然后当我选择下一行时,它会返回。很奇怪。

我删除了所有行或单元格的子类,并用标准内容替换它们,但它仍然会发生。

之前有人见过这个吗?

1 个答案:

答案 0 :(得分:0)

如果你继承了#34; NSTableRowView"并使用它来点亮所选行"。

这通常发生在左边或右边的边框上。

根据苹果示例名为" TableViewPlaygound" (可以在这里找到:https://developer.apple.com/library/mac/samplecode/TableViewPlayground/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010727),这是他们使用的,我经常使用它来快速和脏地复制和粘贴高光照明:

- (void)drawSelectionInRect:(NSRect)dirtyRect {

        NSColor *primaryColor = [[NSColor alternateSelectedControlColor] colorWithAlphaComponent:0.4];
        NSColor *secondarySelectedControlColor = [[NSColor secondarySelectedControlColor] colorWithAlphaComponent:0.4];

    // Implement our own custom alpha drawing
    switch (self.selectionHighlightStyle) {
        case NSTableViewSelectionHighlightStyleRegular: {
            if (self.selected) {
                if (self.emphasized) {
                    [primaryColor set];
                } else {
                    [secondarySelectedControlColor set];
                }
                NSRect bounds = self.bounds;
                const NSRect *rects = NULL;
                NSInteger count = 0;
                [self getRectsBeingDrawn:&rects count:&count];
                for (NSInteger i = 0; i < count; i++) {
                    NSRect rect = NSIntersectionRect(bounds, rects[i]);
                    NSRectFillUsingOperation(rect, NSCompositeSourceOver);
                }
            }
            break;
        }
        default: {
            // Do super's drawing
            [super drawSelectionInRect:dirtyRect];
            break;
        }
    }
}

-(void)drawSeparatorInRect:(NSRect)dirtyRect
{
    NSRect sepRect = self.bounds;
    sepRect.origin.y = NSMaxY(sepRect) - 1;
    sepRect.size.height = 1;
    sepRect = NSIntersectionRect(sepRect, dirtyRect);
    if (!NSIsEmptyRect(sepRect)) {
        [[NSColor gridColor] set];
        NSRectFill(sepRect);
    }
}