我一直在努力工作,在这个问题上搜索了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,没有成功。