当我滚动窗口时,我有一个轻微的刺激,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];
}