Frage

Ich sehe, was Interaktion zwischen den einzelnen Animationen zu sein scheint, und ich würde wirklich irgendwelche Vorschläge schätzen diesen Effekt zu beseitigen.

Grundsätzlich gilt: Ich habe ein iPhone app, die eine Schaltfläche ‚a‘ auf der Root-Ansicht enthält. Tippen auf 'a' drückt einen Blick auf einem Navigations-View-Controller-Stack, mit einer Flip-Animation. Der gedrückte Ansicht hat eine Taste, um den Blick zurück auf die Wurzel Pop.

Der zugrunde liegende Code:

- (IBAction)pushOneView{
TheAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight 
                    forView:delegate.navigationController.view cache:NO];
[delegate.navigationController 
            pushViewController:oneViewController animated:NO];
[UIView commitAnimations];

}

Das scheint gut zu funktionieren, und die Animation ist ziemlich glatt.

Die Stammansicht enthält auch eine Unteransicht ( ‚Panelview‘) und eine weitere Taste, ‚b‘. Panelview kann entweder von zwei anderen Subviews angezeigt - ‚b‘ Swaps zwischen dieser Subviews, mit einer Spin-Animation tippen. Der Code:

-(IBAction)swapPanels{
UIViewController *coming;
UIViewController *going;
float rotation;

if (self.aPanel.view.superview == nil) {
    coming = aPanel;
    going = bPanel;
    rotation = 3.14;
}
else {
    coming = bPanel;
    going = aPanel;
    rotation = -3.14;
}

// First half of spin
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.25];
CGAffineTransform swirlTransform = CGAffineTransformMakeRotation(rotation);
panelView.transform = swirlTransform;
[panelView setAlpha:0.1];
[UIView commitAnimations];

// Finish spin
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.25];
CGAffineTransform secondTransform = 
                        CGAffineTransformRotate(swirlTransform, rotation);
panelView.transform = secondTransform;
[panelView setAlpha:1];
[UIView commitAnimations];

// Swap the panels
[going.view removeFromSuperview];
[panelView insertSubview:coming.view atIndex:0];

}

Dies scheint auch gut zu funktionieren. Jede der Swap-Platten enthält einen Picker und einige Etiketten.

Allerdings habe ich feststellen, dass der ‚a‘ Übergang langsam und ruckartig wird, wenn der ‚b‘ Übergang, bevor es ausgeführt wurde. Mit anderen Worten, wenn ich die app, läuft ‚a‘ hin und her mehrmals starten, läuft es reibungslos. Übung Then ‚b‘ hin und her ein paar Mal. Dann versuchen Sie ‚a‘ wieder ... ‚a‘ jetzt ruckelt, und wird auch so bleiben, bis eine App neu zu starten.

Das ist 100% wiederholbar. Es ist subtil den Simulator, aber ganz offensichtlich auf einem Gerät. Ich habe auf Lecks getestet - keine durch Lecks Werkzeug gezeigt. Wenn die Animation aus der 'b' Operation entfernt wird (nur Kommentar-out die Animationsschritte), um die Wirkung auf 'a' nicht nach dem 'b' subview Swap beobachtet wird ausgeübt. Wenn die Pflücker aus dem Swap-Panel nibs entfernt werden, wird der Effekt ähnlich eliminiert. Wenn das ‚a‘ Animation Übergang zum Cache gesetzt wird, dann nach ‚b‘ es nicht in der Mitte nicht stottern, aber scheint zu ignorieren, Animieren, einfach die Aussicht Swapping (dies kann eine Frage der Wahrnehmung sein).

Im Fall bin ich nicht klar: Ich bin nicht auslösenden dieser getrennten Operationen zur gleichen Zeit. Animation ‚a‘, nach ‚b‘ ausgeführt worden ist - und fertig - ist nicht das gleiche wie wenn ‚b‘ noch nie ausgeführt worden. Gibt es Bereinigungs ich nach einer Animation tun sollte? Ist mein subview-Swapping-Code fehlerhaft? Oder ...?

Vielen Dank im Voraus für alle Anregungen.

War es hilfreich?

Lösung

Sie haben zwei überlappende Animationen in Ihrem ‚b‘ Abschnitt. Wenn Sie eine Animation mit einem beginnen / commit Block erstellen, wird es zu einem Hintergrund-Thread übergibt auszuführen. In Ihrem ‚b‘ Abschnitt, wobei die beiden Animationen, die sequentielle werden sollte eigentlich bei fast gleichzeitig abgefeuert werden. Dies kann bizarres Verhalten verursachen, möglicherweise wie das, was Sie sehen.

Ich würde empfehlen, einen Rückruf in dem ersten Animation auf eine delegierte Methode unter Verwendung von Code wie die folgenden:

[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(rotationAnimationFinished:finished:context:)];

in Ihrem ersten Animation Block in 'b' (die "Erste Hälfte des Spin" -Teil). Dann müssen Sie die Callback-Methode in Ihrer Klasse definieren, in diesem Fall

- (void)rotationAnimationFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context;

In dieser Delegate-Methode, die aufgerufen wird, wenn der erste Teil der Spin-Animation beendet ist, legen Sie den restlichen Code von Ihrer ‚b‘ Methode (alles nach dem „Finish spin“ Kommentar).

Durch diese Animationen Trennung auseinander, das könnte verhindern, dass die Seltsamkeit Sie sehen.

Andere Tipps

Brad Antwort hat scheint mich zu einer Lösung zu haben, führt: weiter die Symptome zu deuten darauf hin, dass etwas über diese ‚b‘ Animationen laufen das System in einem anderen Zustand verlassen, als wenn sie gestartet. Schließlich kam es mir, dass die Transformation Eigenschaft des Panelview links wurde nach den ‚b‘ Animationen gesetzt ... und vielleicht weitere Animationen eines Superview enthält Panelview beeinflusst.

Also habe ich aufgebaut Verfahren wie Brad vorgeschlagen, auszuführen, sobald die ‚b‘ Animationen waren komplett - aber all das Verfahren eingestellt hat wird die Panelview auf den Standard zurückzuverwandeln: CGAffineTransformIdentity:

  • (void) spinFinished: (NSString *) animationID beendet: (BOOL) beendet Kontext: (void *) Kontext { panelView.transform = CGAffineTransformIdentity; }

In diesem Ort, post-'b‘Ausführungen der 'a' Animation erscheinen wieder normal zu sein. Also nochmals vielen Dank, Brad, für Ihre Hilfe hier. Es ist viel geschätzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top