9

我正在尝试创建一个自定义转换,以替代您将在此处获得的默认转换,例如:

[self.navigationController pushViewController:someController animated:YES];

我准备了一个基于 OpenGL 的视图,它对映射到平面的一些静态纹理执行效果(假设它是核心动画中翻转效果的副本)。我不知道该怎么做是:

  • 抓取当前视图内容并从中制作纹理(我记得看到一个功能可以做到这一点,但找不到它)
  • 如何对当前不在屏幕上并将替换当前视图的视图执行相同的操作
  • 是否有一些我可以连接的 API 以使我的转换类尽可能地原生(使其成为一种核心动画效果)?

非常感谢任何想法或链接!

更新

Jeffrey Forbes 的答案非常适合作为捕获视图内容的解决方案。

我还没有弄清楚的是如何捕获我想要转换到的视图的内容,在转换完成之前应该是不可见的。

另外,我应该使用哪种方法来呈现 OpenGL 视图?出于演示目的,我使用了 pushViewController。但是,这会影响导航栏,我实际上想用动画返回一个项目,请查看此视频以获取解释:

http://vimeo.com/4649397

另一种选择是使用 presentViewController,但会显示全屏。您认为创建另一个窗口(或视图?)可能有用吗?

4

4 回答 4

3

虽然我不能完全回答你的问题,但我自己也要做一些研究,但我可以提供一些帮助:

- 为了获得 UINavigationController 的视图,您需要截取屏幕截图。最简单的方法是将其抓取到 UIImage 中:

UIGraphicsBeginImageContext(self.view.frame.size);
[[self.view layer] renderInContext:UIGraphicsGetCurrentContext()];
UIImage* test = UIGraphicsGetImageFromCurrentImageContext();
UIImageView* view = [[UIImageView alloc] initWithImage:test];
UIGraphicsEndImageContext();

我不确定您是否可以将 GLContext(在手机上不熟悉)渲染为 CGImage,但我会做类似的事情(并从中初始化 UIImage)。我会预先渲染您尝试执行的动画的每一帧,并使用其中提供的动画内容将其拍成 UIImageView。也就是说,如果您的动画足够简单。否则,它可能归结为编写自己的动画函数:-/

于 2008-11-23T04:16:56.103 回答
3

我刚刚组合了一个过渡类来在 OpenGL ES 中实现你自己的过渡动画。

随意在这里阅读

项目中有两个示例转换,请随意添加您自己的。

于 2010-03-01T07:50:40.260 回答
1

我认为您可能正在考虑的功能是http://www.opengl.org/sdk/docs/man/xhtml/glCopyTexImage2D.xml ...您将视口设置为纹理大小,然后像往常一样绘制,然后执行glCopyTexImage2D 将场景复制到纹理上。

或者您应该查看 FrameBuffer 对象。XCode 中的默认 OpenGL 模板使用这些。只需生成示例项目即可查看它们是如何工作的。

于 2009-04-18T08:30:30.833 回答
0

我最近在像你这样的视图控制器之间写了一些过渡动画。如果您想从不可见视图中获取任何额外信息,您可以尝试像这样延迟过渡:

- (void)animationFromModalView:(UIView *)modalView toMasterView:(UIView *)masterView
{

[masterView setNeedsLayout];
[masterView layoutIfNeeded];

[self performSelector:@selector(delayAnimationFromModalViewToMasterView) withObject:nil afterDelay:.1f];
}
于 2015-01-11T08:23:31.157 回答