2008-11-21 6 views
9

Je suis en train de créer une transition personnalisée, pour servir de remplacement pour une transition par défaut que vous obtiendriez ici, par exemple:transition Vue personnalisée dans OpenGL ES

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

J'ai préparé un OpenGL vue qui effectue un effet sur une texture statique mappée à un plan (disons qu'il s'agit d'une copie de l'effet de retournement dans Core Animation). Ce que je ne sais pas comment faire est:

  • récupérer le contenu de la vue actuelle et faire une texture de (je me souviens avoir vu une fonction qui fait exactement cela, mais ne peut pas le trouver)
  • comment faire la même chose pour la vue qui est actuellement hors écran et qui va remplacer la vue actuelle
  • Y a-t-il des API auxquelles je peux m'accrocher pour rendre ma classe de transition aussi native que possible (en faire une sorte d'effet Core Animation) ?

Les pensées ou les liens sont grandement appréciés!

MISE À JOUR

réponse de Jeffrey Forbes fonctionne très bien comme une solution pour capturer le contenu d'une vue.

Ce que je n'ai pas encore compris, c'est comment capturer le contenu de la vue vers laquelle je veux passer, ce qui devrait être invisible jusqu'à ce que la transition soit terminée.

De même, quelle méthode dois-je utiliser pour présenter la vue OpenGL? À des fins de démonstration j'ai utilisé pushViewController. Cela affecte la barre de navigation, cependant, que je veux en fait revenir à un élément, avec animation, vérifiez cette vidéo pour l'explication:

http://vimeo.com/4649397.

Une autre option serait d'aller avec presentViewController, mais cela montre plein écran. Pensez-vous que la création d'une autre fenêtre (ou vue?) Pourrait être utile?

Répondre

3

Bien que je ne peux pas répondre complètement à votre question sans faire quelques recherches de mon propre, je peux aider un peu:

-Afin pour obtenir la vue d'un UINavigationController, vous devez prendre une capture d'écran. La meilleure façon de le faire est en saisissant dans un UIImage:

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

Je ne sais pas si vous pouvez rendre une GLContext (pas familier au téléphone) dans un CGImage, mais je ferais quelque chose comme ça (et init un UIImage de cela). Je voudrais prerender chaque image de l'animation que vous essayez de faire et de le glisser dans un UIImageView en utilisant les éléments d'animation fournis à l'intérieur. Autrement dit, si votre animation est assez simple. Sinon, vous pourriez écrire votre propre fonction d'animation: -/

+0

Merci pour vos conseils et désolé pour ma réaction lente supplémentaire! Pourriez-vous vérifier la question mise à jour, peut-être aurez-vous d'autres conseils? – melfar

1

Je pense que la fonction à laquelle vous pensez est http://www.opengl.org/sdk/docs/man/xhtml/glCopyTexImage2D.xml ... vous réglez la fenêtre sur la taille de la texture, puis dessinez comme d'habitude, puis faites glCopyTexImage2D copier la scène sur une texture.

ou vous devriez regarder dans les objets FrameBuffer. Le modèle OpenGL par défaut dans XCode les utilise. Il suffit de générer l'exemple de projet pour voir comment cela fonctionne.

3

Je viens de mettre en place une classe de transition pour implémenter votre propre animation de transition dans OpenGL ES.

Ne hésitez pas à lire à ce sujet here

Il y a deux exemples de transitions dans le projet, ne hésitez pas à ajouter vos propres à elle.

0

J'ai récemment écrit quelques animations de transition entre des contrôleurs de vue comme vous. Si vous souhaitez obtenir toute information supplémentaire de la vue invisible, vous pouvez essayer de retarder la transition comme ceci:

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

[masterView setNeedsLayout]; 
[masterView layoutIfNeeded]; 

[self performSelector:@selector(delayAnimationFromModalViewToMasterView) withObject:nil afterDelay:.1f]; 
} 
Questions connexes