1

Ich benutze diesen Standardcode viele Male in meiner App, um VCs zu nav zu schieben. Regler.Animationen während des Push-View-Controllers zum Nav. Controller funktioniert manchmal nicht mehr

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

Aber manchmal stoppen sie erwerbsfähigen View-Controller correcty gedrückt wird, aber ohne Animation (so wie ich verwenden würde „animiert: NEIN“), und ich kann nicht herausfinden, warum.

Irgendwelche Vorschläge was zu beobachten oder zu versuchen?

+0

Manchmal hält es Arbeitsmittel .. ?? Es wirft einen Fehler oder eine Ausnahme oder es tut nichts? –

+0

App funktioniert gut (kein Absturz), nur Animation ist weg, wenn VC gedrückt wird. – DixieFlatline

+0

vielleicht rufen Sie diese Methode von einem anderen Thread/Queue? Wie Webcallback, Blöcke etc. –

Antwort

0

Immer wenn Sie ... animiert verwenden: YES/NO wird das Cocoa-Framework feststellen, ob es das kann/kann und oft scheitert es. Wie Michael gesagt hat, du bist vielleicht nicht auf dem Hauptthread oder wer weiß was. Wenn Sie sich die neuesten Lion APIs für die Vollbildanimation in einem NSWindow ansehen, finden Sie verschiedene Delegaten für die Animation, die keine Details liefern. Ich würde also nicht erwarten, dass Apple mit einem Animator zurückkehren und solche Funktionen hinzufügen würde.

Um Ihre Frage zu beantworten, würde ich in erster Linie meine eigenen Animationen mit Core Animationen verwenden. Sie sind wirklich nicht so schlimm. Um Ihnen den Einstieg, können Sie eine Kategorie oder Klasse Methode der Einfachheit halber wie folgt erstellen:

+ (void) animateWithDuration:(NSTimeInterval)duration 
        animation:(void(^)())animationBlock 
        completion:(void(^)())completionBlock { 

    [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) { 

     if (duration > 0) [context setDuration:duration]; 
     [context setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]]; 

     if (animationBlock) animationBlock(); 

    } completionHandler:^ { 

     if (completionBlock) completionBlock(); 

    }]; 
} 

Sie können dann verwenden, wie so für mehrere Animationen. Wie so ...

[AnimationContext animateWithDuration:myDuration animation:^{ 

     // You can use whatever animation you want here or even nest 
     CABasicAnimation *fade = /* opacity animation */; 
     [view.layer addAnimation:fade forKey:nil]; 

    } completion:^{ 

     // Do some completion here. 
}]; 

Eine Anmerkung, Sie haben mehr Kontrolle über Ihre Animationen auf diese Weise.

Ich hoffe, dies beantwortet, was Sie suchen.

(Huge Hinweis, mein Beispiel ist für Mac OS X. Auf iOS das Äquivalent zu NSAnimationContext ist mit CATransaction einzuwickeln)

+1

Sie sollten nicht Ihre eigenen schreiben, wenn es bereits eine Klasse gibt, die das für Sie erledigt. Stattdessen finden Sie das Problem und beheben es. – aryaxt

+0

Ich stimme aryaxt zu, wenn Sie keine Kontrolle über die Animation benötigen. – Arvin