我一直在努力工作,在网上搜索这个问题3天,我现在已经没有了资源。 目前将iOS应用程序移植到MacOS(部署10.11)。问题:
我有一个视图层次结构如下:
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的Core Animation。其中,所有视图树都是(隐式)层支持。
按预期工作,滚动,放大等。
然后我需要从文档视图中创建一个图像以生成SCNMaterial内容(3D视图)。 在iOS上,documentView renderInContext按预期工作,并允许创建图像。 在Appkit上,上下文保持透明,图像也是透明的,就像clearColor一样。
如果在创建时设置了documentView.canDrawSubviewsIntoLayer,则视图树呈现OK。这不是解决方案,因为它会阻止不透明度设置工作。
即使隐藏了一个平铺视图(没有不透明度合成),渲染也会失败。
我读到某些类型的视图未呈现。我没有使用它们。在所有视图树上的默认maskToBounds设置旁边没有过滤器,没有蒙版, 。我不知道为什么以及在哪里设置。我试图在创作的所有观点上取消它,但没有成功。它在documentView下面的分组视图上以某种方式再次设置。这可能是问题,但为什么这个属性不受我的控制?
获取视图树渲染的另一种方法,bitmapImageRepForCachingDisplayInRect:/ cacheDisplayInRect:toBitmapImageRep:工作方式相同:ok用canDrawSubviewsIntoLayer,否则为KO。使用两种方法之一制作纹理的Apple代码示例。
有很多帖子,主要是关于SO,抱怨CALayer renderInContext和自定义渲染层树的代码。然而,大多数都很老,现在必须有一个简单的标准方法来实现它。
编辑:在其他尝试中,我尝试设置每个视图的wantLayer,但没有成功。
答案 0 :(得分:0)
好吧,就像你发布帮助请求时一样,你最终会自己找到答案......这就是:
鉴于问题中列出的视图树,我通过在每个平铺视图上设置canDrawSubviewsIntoLayer来实现渲染。这样,图层之间的不透明度合成就会起作用,并且会渲染视图。
我发布这个作为答案,因为它解决了这个问题。
至于为什么这有效,这是我的猜测,但这不是一个授权的答案:每个NSImageView磁贴,平铺视图的子视图,其原点设置为其框架。这不是图层上的变换,而是图块在平铺视图坐标中的位置。这与通过转换定位切片的iOS代码版本有所不同。我将进一步测试,看看是否使用变换而不是帧原点对renderInContext产生影响。
编辑:经过更多测试后,似乎iOS版本有一个转换和块的偏移量。 所以唯一的线索是当一些子视图有一个偏移时,在OSX上下文渲染时层系统会丢失吗?
要点: 解决方案的关键是找到正确的图层设置canDrawSubviewsIntoLayer