【发布时间】:2013-07-30 18:05:32
【问题描述】:
我有一个非常有趣的障碍要克服。我正在尝试在另一个单独的 UIView 中显示 UIView 的实时内容。
我要完成的工作与 Mac OS X 中的 Mission Control 非常相似。在 Mission Control 中,中心有大视图,显示桌面或应用程序。除此之外,还有一些可以重组的小视图。这些小视图显示其相应应用程序的实时预览。预览是即时的,帧率是准确的。最终,我试图以尽可能低的成本重现这种效果。
我尝试了许多可能的解决方案,here 显示的解决方案与我得到的一样接近。它可以工作,但是 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 方法不会在每次更改时调用。我的解决方案是使用 CADisplayLink 调用 [cloneView setNeedsDisplay],因此在每次屏幕刷新时都会调用它。它非常接近我的目标,但帧速率极低。我认为[CALayer renderInContext:] 太慢了。
如果可以让两个 CALayer 渲染同一个源,那将是非常好的。但是,我不确定如何解决这个问题。幸运的是,这只是一个概念应用程序,并不适用于 App Store,因此我可以使用私有 API。我研究了 IOSurface 和 Quartz 上下文,但到目前为止我还没有解决这个难题。任何意见将不胜感激!
【问题讨论】:
-
您是否有理由不能使用与更新原始文件相同的方法来复制视图和更新两者?
-
是的,有。每个视图都非常复杂,复制一个会占用大量内存和时间。一个更实用和有效的解决方案是简单地预览它。 OS X 完美地做到了,所以它一定是可能的。
-
Mission Control 实现可能正在使用用于 OSX 的私有未记录 API。这些 API 在 iOS 上可能不可用。 OSX 也可以在 Mac 上以更高的速度渲染 InContext,而 iOS 看起来很滞后。
-
虽然这是真的,但正如我所说,我可以完全访问 iOS 中使用的所有私有 API,其中包括 OS X 上使用的几乎所有 API。该功能很可能在某处可用。 iOS 比大多数人认为的要强大得多,我相信这是可能的。我只需要朝着正确的方向轻推。虽然 renderInContext 在 OS X 上明显更快,但我怀疑 OS X 是否使用 renderInContext。必须有其他解决方案。
标签: iphone objective-c cocoa-touch uikit quartz-core