我一直在努力工作,在這個問題上搜索了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,沒有成功。