wake-up-neo.com

Benutzerdefinierte Animation zum Verschieben eines UIViewControllers

Ich möchte eine benutzerdefinierte Animation anzeigen, wenn ich einen Ansichtscontroller drücke: Ich möchte eine Art "Erweitern" -Animation erstellen, dh, die neue Ansicht wird von einem bestimmten Rechteck aus vergrößert, beispielsweise [100,100 220,380] während der Animation auf Vollbild.

Irgendwelche Vorschläge, wo ich anfangen soll, bzw. irgendwelche Dokumente, Tutorials, Links? :)


In Ordung. Ich könnte die Expand-Animation mit folgendem Code erstellen:

if ([coming.view superview] == nil)   
    [self.view addSubview:coming.view];
    coming.view.frame = CGRectMake(160,160,0,0);
    [UIView beginAnimations:@"frame" context:nil];
    [UIView setAnimationDuration:4];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [coming viewWillAppear:YES];
    [going viewWillAppear:YES];
    coming.view.frame = CGRectMake(0, 0, 320, 480);
    [going viewDidDisappear:YES];
    [coming viewDidAppear:YES];
    [UIView commitAnimations];

Meine Ansicht wird ordnungsgemäß angezeigt, aber die Navigationsleiste wird leider nicht aktualisiert. Gibt es eine Möglichkeit, das manuell zu tun?


Im Beispielcode heißt eine Funktion alle 0,03 Sekunden, die die Transformation der Ansicht aktualisiert. Wenn ich ein UIViewController drücke, kann ich leider die Größe des Rahmens der Ansicht nicht ändern ... oder?

55
Erik

Sie können den nächsten Ansichtscontroller drücken, ihn aber nicht animieren, wie folgt:

[self.navigationController pushViewController:nextController animated:NO];

... und dann können Sie in dem Ansichtscontroller, der gepusht wird, eine benutzerdefinierte Animation der Ansicht mit CoreAnimation erstellen. Dies kann am besten mit der Methode viewDidAppear:(BOOL)animated geschehen.

Lesen Sie im Core Animation Guide nach, wie die Animation tatsächlich ausgeführt wird. Betrachten Sie insbesondere die implizite Animation.

EDIT: aktualisierter Link

25
imnk

Ich benutze die folgende Funktion (hinzugefügt zu UINavigationController), um die Push-Animation anzupassen:

- (void) pushController: (UIViewController*) controller
         withTransition: (UIViewAnimationTransition) transition
{
    [UIView beginAnimations:nil context:NULL];
    [self pushViewController:controller animated:NO];
    [UIView setAnimationDuration:.5];
    [UIView setAnimationBeginsFromCurrentState:YES];        
    [UIView setAnimationTransition:transition forView:self.view cache:YES];
    [UIView commitAnimations];
}

Ich vermute, Sie könnten diesen Code anpassen, um jede gewünschte Animation zu erstellen.

53
zoul

Der Code, den Sie suchen:

    [UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:0.80];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[UIView setAnimationTransition:
 UIViewAnimationTransitionFlipFromRight
                       forView:self.navigationController.view cache:NO];


[self.navigationController pushViewController:menu animated:YES];
[UIView commitAnimations];
34
fyasar

Heinrich,

Ich habe ein YouTube-Tutorial erstellt, in dem gezeigt wird, wie Ansichten vergrößert und verkleinert werden, wie in der Facebook-iPhone-App.

Hoffe, es kann hilfreich sein: Wie man Ansichten auf dem iPhone SDK vergrößert/verkleinert

Adam

10
Adam

@zoul: Das hat super geklappt! Ich habe gerade "self" in "self.navigationController" und "self.view" in "self.navigationController.view" geändert. Ich weiß nicht, ob das notwendig war, aber es hat funktioniert. Und @crafterm, zum Zurückspringen, erstellen Sie einfach Ihr eigenes leftBarButtonItem, indem Sie diesen Code in viewDidLoad oder ViewWillAppear hinzufügen:

//add your own left bar button
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonTapped)];
self.navigationItem.leftBarButtonItem = backButton;
[backButton release];

Dann habe ich einfach die Push-Funktion optimiert und diese popWithTransition-Funktion erstellt, die ich in meiner -backButtonTapped-Methode aufgerufen habe.

- (void) popWithTransition: (UIViewAnimationTransition) transition
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:.75];
    [UIView setAnimationBeginsFromCurrentState:YES];        
    [UIView setAnimationTransition:transition forView:self.navigationController.view cache:YES];
    [UIView commitAnimations];
[self.navigationController popViewControllerAnimated:NO];
}

Beachten Sie, dass der popViewController-Aufruf nach der Animation bis zum Ende verschoben wurde. Ich weiß nicht, ob das koscher ist, aber es hat wieder funktioniert.

7
David

Schauen Sie sich ADTransitionController an, ein Ersatz für UINavigationController mit benutzerdefinierten Übergangsanimationen (seine API entspricht der API von UINavigationController), die wir bei Applidium erstellt haben.

Sie können verschiedene vordefinierte Animationen für Push und Pop Aktionen verwenden, wie z as Swipe, Fade, Cube, Carrousel und so weiter. In Ihrem Fall ist die von Ihnen angeforderte Animation Zoom.

3
felginep

Was Sie wollen, ist die Downloads für Kapitel 2 von iPhone-Entwickler-Kochbuch . Sehen Sie sich das affineRotate-Beispiel genauer an, obwohl eines der wichtigsten Animatin-Beispiele hilfreich ist.

3
ennuikiller