2009-07-19 7 views
1

J'ai un UIView avec un UIToolBar avec un bouton "Back" quand je commence une transition (UIViewAnimationTransitionFlipFromLeft) d'un UiView à cette vue le bouton apparaît seulement à la fin de la transition Pourquoi? Pls Aidez-moiIPhone UIToolBar UiBarButtonItem Problème de transition

Merci

code:

[UIView beginAnimations:@"View Flip" context:nil]; 
[UIView setAnimationDuration:0.90]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    UIViewController *coming = nil; 
UIViewController *going = nil; 
    UIViewAnimationTransition transition; 
going = languageMenu; 
coming = loadingmenu; 
transition = UIViewAnimationTransitionFlipFromLeft; 
    [UIView setAnimationTransition: transition forView:self.view cache:YES]; 

[coming viewWillAppear:YES]; 
[going viewWillDisappear:YES]; 

[going.view removeFromSuperview]; 
[self.view insertSubview: coming.view atIndex:0]; 
[going viewDidDisappear:YES]; 
[coming viewDidAppear:YES]; 

[UIView commitAnimations]; 
+0

Pouvez-vous montrer un morceau de code? –

+0

Si j'active le cache: NON Le bouton apparaît pendant la transition mais tout est très lent? Une idée ? –

Répondre

1

Je dirais que cela dépend de quand vous créez l'UIToolbar et son bouton de retour, et quand vous les ajoutez à la nouvelle vue.

En outre, existe-t-il une raison particulière pour laquelle les lignes viewWillAppear et viewWillDisappear doivent faire partie de l'animation? J'expérimenterais en les retirant de l'animation et en déplaçant viewDidDisappear et viewDidAppear dans une fonction de rappel invoquée une fois l'animation terminée; Voir les documents pour UIView setAnimationDidStopSelector.

Je ne sais pas si cela aidera, mais il pourrait.

+0

Merci amagrammer j'ai déplacé viewWillAppear et viewWillDisappear hors de bloc d'animation et maintenant fonctionne bien :) Merci! –

+0

Vous êtes les bienvenus! Vous êtes la première personne que j'ai vraiment pu aider sur Stack Overflow. – Amagrammer

0

La façon dont le travail des transitions en cache est l'iPhone prend un instantané de la fenêtre et fait quelques transformations sur elle comme si elle était une image. Les transitions non mises en cache redessinent réellement la fenêtre live lorsqu'elle est transformée.

Votre problème semble être que le bouton de retour n'est pas présent dans la vue lorsque l'instantané est pris. La solution peut être d'ajouter le bouton manuellement plutôt que de s'appuyer sur le contrôleur de la vue de navigation ou quelque chose.

0

Il peut s'agir d'un problème de différence entre les deux vues. Jetez un œil aux attributs de vos vues dans l'IB; as-tu spécifié une barre d'état pour les deux? Ou juste l'un d'eux? Cela pourrait provoquer une différence de décalage vertical et causer des problèmes, je pense.

Vous pouvez peut-être résoudre ce petit problème en réglant vos deux cadres égaux devant le code de transition d'animation:

newViewController.view.frame = self.view.frame; 

(Cela devrait également vous permettre de revenir à cache: OUI)

sur une autre question, vous voudrez peut-être envisager d'ajouter la sous-vue sur la fenêtre actuelle au lieu de la position actuelle de la fenêtre en cours, ainsi:

[[self.view superview] addSubview:newViewController.view]; 

De cette façon, vous pouvez supprimer les appels explicites à tous les événements de la fenêtre. Vous aurez également besoin de lier la transition vers la fenêtre au lieu de la vue actuelle sinon l'animation ne fonctionnera pas:

[UIView setAnimationTransition:transition forView:self.view.superview cache:YES]; 

je luttais avec des problèmes similaires, et finalement obtenu ce droit. Vous pouvez également essayer d'utiliser des animations de base QuartzCore:

#import <QuartzCore/QuartzCore.h> 

// ... 

    // get the view that's currently showing 
    UIView *currentView = self.view; 
    [currentView retain]; 
    // get the the underlying UIWindow, or the view containing the current view 
    UIView *theWindow = [currentView superview]; 

    UIView *newView = myNewViewController.view; 
    newView.frame = currentView.frame; 

    // add subview 
    [theWindow addSubview:newView]; 

    // set up an animation for the transition between the views 
    CATransition *animation = [CATransition animation]; 
    [animation setDuration:0.8]; 
    [animation setType:kCATransitionPush]; 
    [animation setSubtype:kCATransitionFromRight]; 
    [animation setTimingFunction:[CAMediaTimingFunction 
      functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 

    [[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"]; 

Et pour la transition en arrière, faire la même chose (sauf en sens inverse bien sûr) le remplacement de votre ajouter sous-vue avec:

[self.view removeFromSuperview]; 

Avec cela le La fenêtre précédente reviendra au premier plan, mais ses événements ne seront pas déclenchés (je ne sais toujours pas pourquoi).J'espère que cela vous permettra de régler les problèmes et aidera beaucoup d'autres personnes.

Questions connexes