2017-08-31 65 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

相关问题