0

我想要一個類似QuickTime X窗口的窗口。全圓角的不透明窗戶。NSWindow:替代-setOpaque:NO

我獲得它實現自定義的無邊框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,如果它可以幫助。

回答

-1

嘗試使用NSWindow的setAlphaValue方法。

+0

我做到了,但它不工作,因爲它適用的透明度甚至被託管的所有視圖窗口 – Andrea3000 2012-02-29 14:20:15

0

石英/核芯顯卡,不透明rects可以更快地比非不透明rects複合。 但是,一個不透明的窗口意味着你需要繪製一個矩形,任何你沒有填充的東西都是黑色的。

如果您想要自定義窗口不是銳邊矩形,則必須將該窗口設置爲非透明。

無論如何,這幾乎可以肯定,不是你的主要瓶頸。

第一件事就是停止在drawRect中做太多東西: 使該NSBezierPath成爲一個屬性。 只有當rect實際上改變大小時才能替換它。 只能在viewWillDraw中做到這一點:或者一些更早的點。 也許某個視圖或窗口調整了NSNotifications或委託方法的大小。

在drawRect中:你應該儘可能地只做繪畫。 您應該儘可能重新繪製所需的內容。

這仍然很小,並且可能不是您的瓶頸。 您需要檢查窗口中所有視圖中的圖形。

您的窗口實際上是您在OS X上訪問的根CGContext(繪圖上下文)。上下文中的所有內容都是您的子視圖。每個子視圖都是潛在的繪圖瓶頸。

在實時調整窗口大小的過程中,OpenGL視圖繪圖聽起來像是一個主要候選項。 在視圖或窗口的實時調整大小的過程中,您可能會限制幀頻或其他內容。 這應該讓它有點活潑。

除此之外,你會發現NSWindow和NSView類沒有繪製實時調整大小是一個表現勝利。

見的NSView類文檔,並具體規定了部分管理現場調整大小

  • inLiveResize
  • preservesContentDuringLiveResize
  • getRectsExposedDuringLiveResize注意方法:數:
  • rectPreservedDuringLiveResize
  • viewWillStar tLiveResize
  • viewDidEndLiveResize

最後兩個看起來像一個偉大的地方,三明治減少一些繪畫,