Iphone 在另一个UIView中呈现UIView的预览

Iphone 在另一个UIView中呈现UIView的预览,iphone,objective-c,cocoa-touch,uikit,quartz-core,Iphone,Objective C,Cocoa Touch,Uikit,Quartz Core,我有一个非常有趣的障碍要克服。我试图在另一个单独的UIView中显示UIView的实时内容 我试图完成的与Mac OS X中的任务控制非常相似。在任务控制中,中心有大视图,显示桌面或应用程序。除此之外,还有一些可以重新组织的小视图。这些小视图显示相应应用程序的实时预览。预览是即时的,帧速率是精确的。最终,我试图以尽可能低的成本重现这种效果 我已经尝试了许多可能的解决方案,其中一个是我已经得到的最接近。它可以工作,但是不是每次更改都调用-(void)drawLayer:(CALayer*)层inC

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

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

我已经尝试了许多可能的解决方案,其中一个是我已经得到的最接近。它可以工作,但是不是每次更改都调用
-(void)drawLayer:(CALayer*)层inContext:(CGContextRef)ctx
方法。我的解决方案是使用Cadisplay链接调用
[cloneView setNeedsDisplay]
,因此每次屏幕刷新时都会调用它。这非常接近我的目标,但是帧率非常低。我认为
[CALayer renderInContext:
太慢了


如果有可能让两个Calayer渲染同一个源,那将是金色的。然而,我不知道如何处理这个问题。幸运的是,这只是一个概念应用程序,并不是应用商店的目标,所以我可以利用私有API。我已经研究了IOSurface和Quartz上下文,但到目前为止我还没能解决这个难题。任何意见都将不胜感激

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

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

因此,我的建议是将视图与UIWindows分开,并免费获取本机镜像。(根据我的经验,CALayerHost将接管渲染服务器上的目标层,因此,如果CALayerHost和窗口都可见,那么窗口将不再可见,只有层主机将可见(OSX和iOS上使用的方式不是问题)

因此,如果你想要真正的镜像,2份拷贝,你需要求助于你所想的那种东西

其中的一个选项是创建一个UIView子类,该子类使用 此UIView私有方法用于获取目标视图的iSurface,然后每秒使用一次CADisplayLink获取并绘制曲面

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

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


是否有原因不能使用更新原始图像的相同方法复制视图并更新两者?是的,有原因。每个视图都非常复杂,复制一个视图将占用大量内存和时间。一个更实际、更有效的解决方案是简单地预览它。OSX做得很完美,所以它一定是有可能的。任务控制的实现可能使用OSX专用的未记录API。这些API可能在iOS上不可用。OSX还可以在Mac上以更高的速度呈现上下文,而iOS看起来很落后。虽然这是事实,正如我所说,我可以完全访问iOS中使用的所有私有API,其中包括几乎所有在OS X上使用的API。该功能很可能在某个地方可用。iOS比大多数人看起来要强大得多,我相信这是可能的。我只需要朝正确的方向轻推一下。虽然RenderContext在OSX上显然更快,但我怀疑OSX是否使用RenderContext。一定还有另一个解决办法。完美,正是我所寻找的,只是朝着正确的方向轻轻推了一下。我确实有一个问题;当你说每个窗口都有一个.contentID属性时,你是说一个?我想是的。这是我之前在CALayerHosts上尝试过的,但是我发现作为另一个UIWindow的子视图的UIWindow的上下文ID具有相同的上下文ID。我想我已经找到了发生这种情况的原因,我应该能够找到一些工作。这是非常有价值的信息!您已经完成了非常出色的工作。UIWindows不应该是其他UIWindows的子视图。UIWindow是包含UIView的容器,它们没有superview。如果您将它们添加到其他窗口中,那么是的,它们将具有相同的contextID,因为只有它们的父窗口实际具有一个contextID,并且它将报告这一点。