1

当我滚动窗口时,我有一个轻微的刺激,NSCollectionView其中NSCollectionViewItem's 在视觉上会破裂。

分解的速度取决于滚动的速度。例如,如果我慢慢滚动,分手会更频繁地发生。快速滚动较少。看来问题出在NSCollectionViewItem我正在使用的自定义 NSView 越过可视框架的边界时。

我的 NSView(自定义视图NSCollectionViewItem)有一个非常简单的绘图算法 - 没什么太复杂的。

本质上,我在 drawRect 方法的 dirtyRect 中创建了一个框架,并在其中创建了一些框架:

-(void)drawRect:(NSRect)dirtyRect
{   
    NSRect mOuterFrame = NSMakeRect(dirtyRect.origin.x, dirtyRect.origin.y, 104, 94);
    NSRect mSelectedFrame = NSInsetRect(mOuterFrame, 2, 2);
    NSRect mRedFrame = NSInsetRect(mSelectedFrame, 2, 2);
    NSRect mInnerFrame = NSInsetRect(mRedFrame, 2, 2);

    NSBezierPath * mOuterFramePath = [NSBezierPath bezierPathWithRect:mOuterFrame];
    NSBezierPath * mSelectedFramePath = [NSBezierPath bezierPathWithRect:mSelectedFrame];
    NSBezierPath * mRedFramePath = [NSBezierPath bezierPathWithRect:mRedFrame];
    NSBezierPath * mInnerFramePath = [NSBezierPath bezierPathWithRect:mInnerFrame];

    [mainBackgroundColor set];
    [mOuterFramePath fill];

    if (selected)
        [[NSColor yellowColor] set];
    else
        [mainBackgroundColor set];

    [mSelectedFramePath fill];

    if (isRedBorder)
        [[NSColor redColor] set];
    else
        [mainBackgroundColor set];

    [mRedFramePath fill];

    [[NSColor blackColor] set];
    [mInnerFramePath fill];
}

我已经尝试在代码之前和之后锁定焦点并释放,以及设置图形上下文并恢复它——这些似乎都不能解决问题。

我正在使用 Snow Leopard - 我认为这并不重要。

解决方案更新

对于任何对此感兴趣的人,都是 NSResponder 推荐的问题的解决方案。mOuterFrame我是根据所指出的drawRect:方法创建初始值,这是不正确的做法。dirtyRect快速变化:

NSRect mOuterFrame = NSMakeRect(dirtyRect.origin.x, dirtyRect.origin.y, 104, 94);

到基于 0 的起始点:

NSRect mOuterFrame = NSMakeRect(0, 0, 104, 94);

我还调整了代码的效率,因为我只使用矩形,正如建议的那样,尽管上面的代码更改足以解决问题本身。我必须添加一个更改以获得两像素线。新方法:

-(void)drawRect:(NSRect)dirtyRect
{   
    NSRect mOuterFrame = NSMakeRect(0, 0, 104, 94);
    NSRect mSelectedFrame = NSInsetRect(mOuterFrame, 2, 2);
    NSRect mRedFrame = NSInsetRect(mSelectedFrame, 2, 2);
    NSRect mInnerFrame = NSInsetRect(mRedFrame, 2, 2);

    [NSBezierPath setDefaultLineWidth:2.0];

    [mainBackgroundColor set];
    [NSBezierPath strokeRect:mOuterFrame];

    if (selected)
        [[NSColor yellowColor] set];
    else
        [mainBackgroundColor set];

    [NSBezierPath strokeRect:mSelectedFrame];

    if (isRedBorder)
        [[NSColor redColor] set];
    else
        [mainBackgroundColor set];

    [NSBezierPath strokeRect:mRedFrame];

    [[NSColor blackColor] set];
    [NSBezierPath strokeRect:mInnerFrame];
}
4

1 回答 1

1

我注意到的第一件事是您上面的代码相当浪费,因为您正在创建一堆路径,而您可以只使用 NSFrameRect() 和 NSRectFill() 代替。

其次,你绘制的几何图形不应该依赖于传递给 -drawRect: 的矩形。该矩形只是告诉您要更新的区域是什么,因此如果您的视图很复杂,您可以更有效地决定绘制什么。

于 2009-11-19T04:33:51.130 回答