NSWindow:替代-setOpaque:NO

时间:2012-02-25 20:11:58

标签: objective-c nsview nswindow rounded-corners private-methods

我想要一个类似于QuickTime X窗口的窗口。一个带圆角的全不透明窗口。

我已经通过以下方式实现了自定义无边界NSWindow

[window setOpaque:NO];
[window setBackgroundColor: [NSColor clearColor]];

和自定义NSView

- (void)drawRect:(NSRect)rect
{
    NSBezierPath* thePath = [NSBezierPath bezierPath];
    [thePath appendBezierPathWithRoundedRect:rect xRadius:radius yRadius:radius];
    [thePath fill];
}

它按预期工作,但是当快速调整大小时窗口会变得非常慢。

我发现这种减速是由-setOpaque:NO给出的;如果我删除该行,窗口可以再次快速调整大小,但角落显然不会更圆。

有没有办法避免使用-setOpaque:NO并且仍然可以使用圆角?也许有一个窗户除了角落外都是不透明的?

视图是NSOpenGLView,所以我可以利用OpenGL,如果有帮助的话。

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

在Quartz / Core Graphics中,不透明的复合比非透明的复合更快。 但是一个不透明的窗口意味着你需要绘制一个矩形,你没有填充的任何东西都是黑色的。

如果您想要一个不是锐边矩形的自定义窗口,则必须将窗口设置为非不透明。

无论如何,这几乎可以肯定,不是你的主要瓶颈。

首先要停止在drawRect中做这么多东西: 使NSBezierPath成为属性。 只有当rect实际改变尺寸时才更换它。 只在viewWillDraw中执行此操作:或稍早一点。 也许其中一个视图或窗口调整NSNotifications或委托方法。

在drawRect中:你应该尽可能地只画画。 你应该尽可能地重新绘制你需要的东西。

这仍然很小,可能不是你的瓶颈。 您需要在窗口的所有视图中检查绘图。

您的窗口实际上是您在OS X上可以访问的根CGContext(绘图上下文)。您的上下文中的所有内容都是您的子视图。 每个子视图都是潜在的绘图瓶颈。

在窗口实时调整大小期间的OpenGL视图绘图听起来像是一个主要的候选者。 在视图或窗口的实时调整大小期间,您可能会限制帧速率或某些内容。 这应该会让它变得更加快捷。

除此之外,您还会注意到NSWindow和NSView课程在实时调整大小期间没有绘制,这是一场性能上的胜利。

请参阅NSView类文档,特别是 管理实时调整大小

部分中提到的方法
  • inLiveResize
  • preservesContentDuringLiveResize
  • getRectsExposedDuringLiveResize:数:
  • rectPreservedDuringLiveResize
  • viewWillStartLiveResize
  • viewDidEndLiveResize

最后两个看起来像是一个将绘画减少三明治的好地方,

答案 2 :(得分:-1)

尝试使用NSWindow的setAlphaValue方法。