1

我有一个非常有趣的障碍要克服。我正在尝试在另一个单独的 UIView 中显示 UIView 的实时内容。

我要完成的工作与 Mac OS X 中的任务控制非常相似。在任务控制中,中心有大视图,显示桌面或应用程序。除此之外,还有一些可以重组的小视图。这些小视图显示其相应应用程序的实时预览。预览是即时的,帧率是准确的。最终,我试图以尽可能便宜的方式重现这种效果。

我尝试了许多可能的解决方案,这里显示的一个与我得到的一样接近。它有效,但是- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx并非每次更改都调用该方法。我的解决方案是[cloneView setNeedsDisplay]使用 CADisplayLink 调用,因此在每次屏幕刷新时都会调用它。它非常接近我的目标,但帧速率极低。我认为这[CALayer renderInContext:]太慢了。

如果有可能让两个 CALayer 渲染相同的源,那将是黄金。但是,我不确定如何解决这个问题。幸运的是,这只是一个概念应用程序,并不适用于 App Store,因此我可以使用私有 API。我研究了 IOSurface 和 Quartz 上下文,但到目前为止我还没有解决这个难题。任何投入将不胜感激!

4

1 回答 1

2

iOS 和 OSX 实际上在底层基本相同。(然而,当你获得更高的堆栈时,iOS 实际上比 OSX 更先进,因为它更新并且有一个新的开始)

但是,在这种情况下,它们都使用相同的东西(我相信)。您会注意到有关任务控制的一些信息。它隔离了“窗口”而不是视图。在 iOS 上,每个 UIWindow 都有一个“.contentID”属性,CALayerHost 可以用来使渲染服务器在它们中的 2 个(即 2 层)之间共享渲染上下文。

所以我的建议是让你的视图分离 UIWindows 并免费获得本机镜像-(ish)。(根据我的经验,CALayerHost 通过渲染服务器接管目标图层位置,因此如果 CALayerHost 和窗口都可见,则窗口将不再存在,只有图层主机(它们在 OSX 上的使用方式)和 iOS 不是问题)。)

因此,如果您追求真正的镜像,它的 2 个副本,您将需要求助于您正在考虑的那种事情。

1 选项是创建一个 UIView 子类,它使用 https://github.com/yyfrankyy/iOS5.1-Framework-Headers/blob/master/UIKit.framework/UIView-Rendering.h#L12 这个 UIView 私有方法获取目标视图的 IOSurface,然后每秒使用一次 CADisplayLink 获取并绘制表面。

另一个可能有效的选项(我不确定,因为我不知道您的设置或期望的效果)可能只是使用 CAReplicatorLayer,它使用相同的后备存储显示 CALayer 的镜像(非常快速和高效 + 公共稳定API)。

抱歉,我不能给你一个固定的“这是答案”,但希望我已经给了你足够的想法和可能性来开始。我还提供了一些链接,这些链接指向您可能会觉得有用的内容。

CAReplicatorLayer 背后的魔力是什么?

http://aptogo.co.uk/2011/08/no-fuss-reflections/

http://iphonedevwiki.net/index.php/SBAppContextHostManager

http://iphonedevwiki.net/index.php/SBAppContextHostView

http://iphonedevwiki.net/index.php/CALayerHost

http://iky1e.tumblr.com/post/33109276151/recreating-remote-views-ios5

http://iky1e.tumblr.com/post/14886675036/current-projects-understanding-ios-app-rendering

于 2013-07-31T02:48:41.880 回答