2017-08-31 64 views
0

我一直在努力工作,在這個問題上搜索了3天的互聯網,而我現在用完了資源。 當前將iOS應用程序移植到MacOS(部署10.11)。問題:什麼可以防止NSView.layer renderInContext:?

我有如下視圖層次:

NSScrollview 
    documentView 
    grouping view 
     tiling view one 
     array of NSImageView (each one being a tile) 
     tiling view two 
     array of NSImageView (each one being a tile) 

的兩個平鋪視圖被完全覆蓋,這取決於UI的一個可以被隱藏或第二個已不透明度設置爲低於1.0共混兩個平鋪的視圖。

由於不透明的要求以及性能,CAlayer支持視圖。這是從IB到NSScrollview檢查覈心動畫完成的。那麼,所有的視圖樹都是(隱含)層支持的。

按預期方式工作,滾動,放大等。

然後我需要的圖像出文檔視圖,以產生SCNMaterial內容(3D視圖)。 在iOS上,documentView renderInContext按預期工作,並允許創建圖像。 在Appkit上,上下文保持透明,圖像也是透明的,同樣,圖像也是有效的對象,而clearColor也是如此。

如果在創建時設置了documentView.canDrawSubviewsIntoLayer,則視圖樹呈現OK。這不可能是解決方案,因爲它可以防止不透明度設置工作。

即使隱藏了一個平鋪視圖(不透明度合成),渲染也會失敗。

我看到某些種類的視圖沒有渲染。我不使用它們。在所有視圖樹的默認masksToBounds設置旁邊沒有過濾器,沒有蒙版,。我不知道爲什麼和在哪裏設置。我試圖在創作時忽略所有觀點,但沒有成功。它以某種方式再次設置,在documentView下面的分組視圖中。這可能是問題,但爲什麼這個屬性超出了我的控制範圍?

另一種獲取視圖樹渲染的方式,bitmapImageRepForCachingDisplayInRect:/ cacheDisplayInRect:toBitmapImageRep:與CanDrawSubviewsIntoLayer相同:使用相同的方法,否則返回KO。蘋果代碼示例使視圖中的紋理使用兩種方法中的任何一種。

有很多帖子,主要是關於SO,抱怨CALayer renderInContext和代碼自定義渲染圖層樹。儘管如此,大多數都很古老,現在必須有一個簡單的標準方法來實現它。

編輯:除了其他嘗試,我試圖設置每個視圖wantsLayer,沒有成功。

回答

0

好,經常當您發佈請求幫助,你終於找到自己的答案......這就是:

鑑於在這個問題中列出的視圖樹,我實現了以使其通過設置canDrawSubviewsIntoLayer在每個平鋪視圖上。通過這種方式,圖層之間的不透明度合成工作正常,呈現視圖。

我張貼這個答案,因爲它解決了這個問題。

至於爲什麼這個作品,這是我的猜測,但這不是一個授權的答案:每個NSImageView瓷磚,瓷磚鑑於子視圖,都原籍設置爲自己的框架。這不是圖層上的變換,而是平鋪視圖座標中的框架位置。這與通過變換定位圖塊的iOS代碼版本有所不同。我要進一步測試,看看是否使用轉換,而一幀起源使得以renderInContext差別。

編輯:更多的測試後,似乎iOS版本有一個轉換和偏移的瓷磚。 因此,唯一的線索就是在OSX背景渲染時,當一些子視圖已經偏移層系統迷路?

總結: 關鍵點到該溶液中是找到合適的層在何處設置canDrawSubviewsIntoLayer

相關問題