2012-05-23 88 views
11

我有點困惑。 的Apple Documentation狀態這樣的:允許層疊支持的NSView同胞重疊嗎?

注:由於性能原因,可可並不強制剪輯中 同級觀點或保證正確的失效和繪製行爲 當兄弟的意見重疊。如果您希望在 前面繪製視圖,則應該使前視圖成爲後視圖的子視圖(或後代) 。

所以根據這個,兄弟姐妹的意見不應該重疊或否則行爲是不確定的。

Cocoa Slides demo app,然而,層支持的NSView兄弟姐妹做重疊,它似乎只是很好地工作:

Cocoa Slides screenshot

原來是可可幻燈片示例代碼錯誤的,這只是一個巧合,它的工作原理還是文檔已過時?從10.5開始過時了,那是?

回答

7

重疊視圖在Leopard及更高版本上正常工作,無論是否支持圖層。

+3

{引用需要} – uliwitness

+2

我對這個主題的看法與@uliwitness的答案相匹配。當你混合和匹配圖層支持和非圖層支持的視圖時,有一些注意事項。 – SayeedHussain

+0

不幸的是,他們不工作,如果他們不分層。我嘗試在CEF(鉻嵌入式框架)窗口中創建一個額外的NSView的幫助,所以它不會在它後面呈現。 (看起來CEF內部使用OpenGL或其他魔法)。我發現的唯一方法是讓我的NSView分層,並將CEF保留爲通常的一個 –

6

經過一番研究,似乎Apple文檔確實已經過時。

從10.5開始,層支持的NSView兄弟可以​​重疊。

discussion from 2009,涉及到蘋果的工程師大衛·鄧肯和Corbin Dunn終於提供了一些明確的答案:

重疊意見豹工作,但在此之前不工作。 文檔已過時。

我有一組視圖,每一個與內部許多較小的觀點, 這就需要以重疊的方式在相同的 矩形的窗口上呈現,使得它們可以互相看到。在我的 初步測試中,我將每個大視圖作爲單個背景視圖的兄弟。正計劃在必要時通過重新安排z-order將每一個帶到前面, 。這個appoach有未來(或 禮物)嗎?

這將工作在豹。

來源:http://www.cocoabuilder.com/archive/cocoa/228191-nsview-behaves-different-on-10-4-vs-10-5.html#228983

更新James Dempsey also replied on Twitter

我的理解是,重疊的兄弟意見爲10.5 OK,層支持與否。

+0

非層支持的NSView兄弟姐妹不得重疊。看到我的答案。 – nschmidt

+0

@nschmidt有趣的。你可能有一個示例應用程序,顯示有非層支持重疊同胞NSViews有問題嗎?兩位(前)蘋果工程師表示10.5以來情況良好,在我的測試中,它似乎是真的。 –

+0

我已經上傳了一個簡單的演示到[github](https://github.com/nsc/SiblingViews.git)。在背景中有一個滾動視圖重疊了幾個視圖。當你滾動時,一切都搞砸了。 – nschmidt

4

層支持的觀點是由OpenGL的層次(當然,Quartz的合成,但它有助於覺得每一層與上一個OpenGL紋理多邊形),所以他們一直支持正確的重疊。

CocoaBuilder/Cocoa-Dev上的線程根本沒有提到層。這意味着它會在沒有支持CALayer的情況下談論普通的NSView(或者說,整個窗口只有CALayer)。

提到的一個例外是OpenGLView(同樣沒有圖層),它總是在窗口頂部合成它的OpenGL矩形,消除任何子視圖。我不認爲製作一個NSOpenGLView圖層支持的作品,但是可以使用OpenGL圖層,它將在其他圖層之間正確合成。

另一個例外是非層支持的視圖之上的圖層,這是有道理的,因爲所有非支持圖層的視圖都有效地佔據了一個單獨的圖層,當然這個圖層低於它的任何子圖層(哪個圖層在非分層備份的父視圖中託管的視圖必須是)。

簡而言之,它適用於非分層的10.5版本,並且永遠支持層次支持的視圖,當您混搭搭配或使用OpenGL時需要注意。儘管如此,我並不是100%確定重疊的非層次支持視圖的聲明應該被認爲是規範的。這是一位蘋果工程師的非正式聲明。事情可能已經發生變化,可能會發現錯誤使事情無法正常工作。當我想要正確的重疊時,我通常會使用圖層。

+0

有趣!我甚至沒有注意到他們沒有明確提到圖層。然而,核心動畫從10.5版開始纔出現,因此在此之前沒有層次支持的觀點。 您確定重疊功能與非支持層的視圖可靠嗎?這是我第一次聽到(雖然會很棒!)。這也許是相關的:http://stackoverflow.com/questions/466297/is-there-a-proper-way-to-handle-overlapping-nsview-siblings –

+0

我沒有說任何重疊的工作與非層 - 後視圖。它肯定不*在舊版本中工作(雖然它通常看起來像工作,它隨機的情況下打破,有非重疊的非層支持的意見非常不確定) – uliwitness

+0

哦,看起來我確實說它「工程自10.5以來非分層「。 :-S – uliwitness

2

這可能對某人有用:我在MacOS 10.7+上出現閃爍的重疊非分層子視圖問題。在我的應用程序中,視圖用於呈現關於選定圖形對象(選擇框架,縮放控制點等)的一些信息,因此它們有一些動畫 - 這是他們在我的情況下的關鍵。

看起來像重疊的兄弟姐妹真的很好,即使沒有圖層,但在更簡單的情況下。我有一堆動畫視圖,每個視圖都有它自己的計時器 - 然後彈起。我找到了兩種解決方案:打開同步動畫,切換到單個共享計時器並在同一時刻更新所有視圖。

至少這個技巧在我的應用程序中有所幫助,因爲我不想使用圖層。

+0

這是正確的,如果您正在爲同級NSView(與另一個NSView重疊)設置動畫,那麼您將看到閃爍和怪異的行爲。如果您希望它看起來正確,則需要在動畫過程中更新所有視圖。 – strange

1

NSView兄弟姐妹通常允許重疊。有一件事可能會打擊你,但默認情況下NSScrollView是如何工作的。當你有一個香草NSScrollView重疊的兄弟姐妹視圖的事情打破。

這是因爲NSClipView只繪製了滾動的視圖部分並複製了沒有改變的東西。當你有兄弟姐妹視圖重疊滾動視圖時,這種優化不起作用,即使它們只是兄弟姐妹,視圖也會滾動。

爲了讓重疊的兄弟意見工作,即使他們沒有層支持的,因此,你必須禁用此優化:

[scrollView.contentView setCopiesOnScroll:NO]; 
+1

主席先生,你是一位紳士和學者。 –