【问题标题】:NSWindow: alternative to -setOpaque:NONSWindow: 替代 -setOpaque:NO
【发布时间】:2014-04-08 11:53:48
【问题描述】:

我想要一个类似于 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。

【问题讨论】:

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


    【解决方案1】:

    【讨论】:

    • 该示例使用 -setOpaque:NO 将窗口设置为透明。我正在寻找一种解决方案,它可以让我在不将其设置为透明的情况下圆窗角
    【解决方案2】:

    在 Quartz/Core Graphics 中,不透明矩形的合成速度比不透明矩形快。 但是一个不透明的窗口意味着你需要画一个矩形,而你没有填充的东西都是黑色的。

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

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

    第一件事是停止在drawRect中做这么多的事情: 使 NSBezierPath 成为一个属性。 只有在矩形实际改变大小时才更换它。 仅在 viewWillDraw: 或更早的时候这样做。 可能是视图或窗口之一调整大小 NSNotifications 或委托方法。

    在drawRect中:你应该尽可能只做真正的绘图。 您应该尽可能只重绘您需要的部分。

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

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

    在实时调整窗口大小期间绘制 OpenGL 视图听起来像是主要候选对象。 您可能会在实时调整视图或窗口大小期间限制帧速率或其他内容。 这应该让它更快一点。

    除此之外,您会从 NSWindow 和 NSView 类中注意到,在实时调整大小期间不绘制是一种性能优势。

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

    部分中提到的方法
    • 实时调整大小
    • preservesContentDuringLiveResize
    • getRectsExposedDuringLiveResize:count:
    • rectPreservedDuringLiveResize
    • viewWillStartLiveResize
    • viewDidEndLiveResize

    最后两个看起来像是减少绘画的好地方,

    【讨论】:

      【解决方案3】:

      尝试使用 NSWindow 的 setAlphaValue 方法。

      【讨论】:

      • 我做到了,但它不起作用,因为它甚至将透明度应用于窗口托管的所有视图
      猜你喜欢
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多