我想要一个类似于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,如果有帮助的话。
答案 0 :(得分:0)
请参阅此Apple开发人员示例:https://developer.apple.com/library/mac/#samplecode/RoundTransparentWindow/Introduction/Intro.html
答案 1 :(得分:0)
在Quartz / Core Graphics中,不透明的复合比非透明的复合更快。 但是一个不透明的窗口意味着你需要绘制一个矩形,你没有填充的任何东西都是黑色的。
如果您想要一个不是锐边矩形的自定义窗口,则必须将窗口设置为非不透明。
无论如何,这几乎可以肯定,不是你的主要瓶颈。
首先要停止在drawRect中做这么多东西: 使NSBezierPath成为属性。 只有当rect实际改变尺寸时才更换它。 只在viewWillDraw中执行此操作:或稍早一点。 也许其中一个视图或窗口调整NSNotifications或委托方法。
在drawRect中:你应该尽可能地只画画。 你应该尽可能地重新绘制你需要的东西。
这仍然很小,可能不是你的瓶颈。 您需要在窗口的所有视图中检查绘图。
您的窗口实际上是您在OS X上可以访问的根CGContext(绘图上下文)。您的上下文中的所有内容都是您的子视图。 每个子视图都是潜在的绘图瓶颈。
在窗口实时调整大小期间的OpenGL视图绘图听起来像是一个主要的候选者。 在视图或窗口的实时调整大小期间,您可能会限制帧速率或某些内容。 这应该会让它变得更加快捷。
除此之外,您还会注意到NSWindow和NSView课程在实时调整大小期间没有绘制,这是一场性能上的胜利。
请参阅NSView类文档,特别是 管理实时调整大小
部分中提到的方法最后两个看起来像是一个将绘画减少三明治的好地方,
答案 2 :(得分:-1)
尝试使用NSWindow的setAlphaValue方法。