2008-11-21 12 views
9

Ich versuche, einen benutzerdefinierten Übergang zu schaffen, als Ersatz für einen Standardübergang dienen Sie hier bekommen würden, zum Beispiel:Benutzerdefinierte Ansicht Übergang in OpenGL ES

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

ich bestimmt habe ein OpenGL-basierte Ansicht, die einen Effekt auf eine statische Textur ausübt, die einer Ebene zugeordnet ist (angenommen, es handelt sich um eine Kopie des Umblättereffekts in der Kernanimation). Was ich nicht weiß, wie zu tun ist:

  • greifen aktuelle Ansicht Inhalt und machen eine Textur aus ihm heraus (ich eine Funktion erinnere mich, die genau das tut, aber kann es nicht finden)
  • wie das Gleiche für die Ansicht zu tun, die momentan außerhalb des Bildschirms ist und die aktuelle Ansicht ersetzen wird
  • gibt es einige APIs, an die ich haken kann, um meine Übergangsklasse so nativ wie möglich zu machen (mach es zu einer Art Kernanimationseffekt) ?

Alle Gedanken oder Links werden sehr geschätzt!

UPDATE

Antwort Jeffrey Forbes funktioniert groß wie eine Lösung, den Inhalt einer Ansicht zu erfassen.

Was ich noch nicht herausgefunden habe, ist, wie man den Inhalt der Ansicht erfasst, zu der ich wechseln möchte, die bis zum Übergang unsichtbar sein sollte.

Auch, welche Methode sollte ich verwenden, um die OpenGL-Ansicht zu präsentieren? Zu Demonstrationszwecken habe ich pushViewController verwendet. Das betrifft die Navbar, obwohl ich tatsächlich ein Element zurück, mit Animation gehen möchte, überprüfen Sie dieses Video zur Erklärung:

http://vimeo.com/4649397.

Eine andere Option wäre, mit presentViewController zu gehen, aber das zeigt Vollbild. Glauben Sie, dass das Erstellen eines anderen Fensters (oder einer Ansicht?) Nützlich sein könnte?

Antwort

3

Während ich nicht ganz Ihre Frage, ohne dabei etwas mehr Forschung meiner eigenen Antwort kann ich ein bisschen helfen kann:

-Um die Ansicht eines UINavigationController zu bekommen, benötigen Sie einen Screenshot zu machen. Der einfachste Weg dies zu tun ist, indem es in eine UIImage Grabbing:

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

Ich bin nicht sicher, wenn Sie eine GLContext (nicht vertraut am Telefon) in eine CGImage machen können, aber ich würde so etwas tun (und initiiere ein UIImage von dem). Ich würde jeden Frame der Animation, die Sie versuchen, vorrendern und ihn in eine UIImageView einfügen, indem Sie die darin enthaltenen Animationsdateien verwenden. Das heißt, wenn Ihre Animation einfach genug ist. Sonst könnte es am Schreiben Ihrer eigenen Animationsfunktion liegen: -/

+0

Vielen Dank für Ihre Beratung und sorry für meine zusätzliche langsame Reaktion! Können Sie die aktualisierte Frage überprüfen, vielleicht haben Sie weitere Ratschläge? – melfar

1

Ich denke, die Funktion, an die Sie denken könnten, ist http://www.opengl.org/sdk/docs/man/xhtml/glCopyTexImage2D.xml ... Sie legen das Ansichtsfenster auf die Texturgröße und dann wie gewohnt zeichnen, dann tun GlCopyTexImage2D um die Szene auf eine Textur zu kopieren.

oder Sie sollten in FrameBuffer Objects schauen. Die Standard-OpenGL-Vorlage in XCode verwendet diese. Erzeugen Sie einfach das Beispielprojekt, um zu sehen, wie diese funktionieren.

3

Ich habe gerade eine Übergangsklasse zusammengestellt, um Ihre eigene Transitionsanimation in OpenGL ES zu implementieren.

Fühlen Sie sich frei über sie here

Es gibt zwei Beispiel Übergänge in das Projekt zu lesen, Sie es selbst hinzufügen frei fühlen.

0

Ich schreibe vor kurzem einige übergangsweise Animation zwischen View-Controllern wie Sie. Wenn Sie zusätzliche Informationen aus dem unsichtbaren Ansicht erhalten möchten, können Sie versuchen, den Übergang wie diese Verzögerung:

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

[masterView setNeedsLayout]; 
[masterView layoutIfNeeded]; 

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