重绘NSCollectionView上滚动导致显卡的解体
-
20-09-2019 - |
题
我在一个NSCollectionView
轻微的刺激性,其中NSCollectionViewItem
的分手目视当我滚动窗口。
解体的速率取决于滚动的速率。例如,如果我慢慢滚动解体更经常发生。快速滚动少一些。它出现的问题是在使用自定义的NSView的NSCollectionViewItem
的我使用十字所述可视帧的边界。
我的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];
}
我试图锁定焦点和释放之前和之后的代码以及设置图形上下文和恢复它。 - 其中没有一个似乎要解决的问题
我使用雪豹 - 不是,我认为是有差别
<强>解决方案更新强>
有关任何有兴趣这里是解决该问题的建议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];
}
解决方案
我注意到的第一件事是,上面的代码是相当浪费,因为你创造了一堆的路径时,你可以只使用NSFrameRect()和NSRectFill()代替。
其次,你画什么不应该依赖于传递给-drawRect的矩形几何:.该矩形只是告诉你什么样的区域更新,所以你可以在决定画什么,如果你的看法是复杂的更有效率。
不隶属于 StackOverflow