【发布时间】:2016-07-29 16:02:52
【问题描述】:
我正在尝试展示另一个 NSView 的外观实时视觉。
我的问题不是将视图呈现为图像。 cocoa: how to render view to image?
我们将源视图称为事件视图,将一对多目标视图称为镜像视图。
每个视图都有一个导出和导入 CGLayer。
导出层将让它充当一个事件视图。
导入层将让它充当一个镜像视图。
这个想法是 Incident View 将投射一个 ncdntReflection 并且其所有 Mirror Views 将在其 mrrSurface 上捕捉该反射.
- ncdntReflection:事件视图的导出 CGLayer。
- mrrSurface:镜像视图的导入 CGLayer。
到目前为止,我已经尝试了 3 种方法...
1. CGLayer 作为后备存储:
- 将Incident View及其子视图的内容绘制到ncdntReflection中。
- 将 ncdntReflection 绘制到 Incident View 的 当前上下文中。
- 将 Mirror View(s) 的 mrrSurface 设置为 ncdntReflection。
2。将 CALayers 合成到 CGLayer 中
- 将 Incident View 的支持 CALayers 及其子视图绘制到 ncdntReflection 中。
- 将 Mirror View(s) 的 mrrSurface 设置为 ncdntReflection。
3. cacheDisplayInRect 或 CGWindowListCreateImage
- 使用任一方法捕获事件视图的内容
- 将这些内容绘制到 ncdntReflection。
- 将 Mirror View(s) 的 mrrSurface 设置为 ncdntReflection。
出于以下原因,我不喜欢这些方法中的任何一种。
折叠图层不是一个选项,因为我需要每个图层上的动画。这意味着选项 1 和 2 都必须递归才能获取所有子视图。我担心这种绘图会影响性能。
选项 3 需要太长时间才能成为有效的解决方案。
理想情况下,事件视图和镜像视图都将遵循相同的渲染指令 - 就像 WPF 视觉画笔一样。
有金属溶液吗?
【问题讨论】:
-
Metal 根本帮不了你。你看过
NSViews displayRectIgnoringOpacity:inContext: 方法吗? -
@SilvanMosberger 这正是我所需要的!如果你回答了这个问题,我一定会感谢你。
标签: macos cocoa rendering quartz-graphics metal