2009-07-19 5 views
1

Je souhaite que la barre de navigation se cache plus lentement que d'habitude.Changer la durée de l'animation

J'ai essayé ce qui suit, mais quand cacher, il disparaît instantanément au lieu de l'animation sur (le point de vue ci-après n'animer correctement):

[UIView beginAnimations:@"hideNavBar" context:nil]; 
[UIView setAnimationDuration:2.0]; 
[self.navigationController setNavigationBarHidden:value]; 
[UIView commitAnimations]; 

Si substitut I:

[self.navigationController setNavigationBarHidden:value animated:YES]; 

Ensuite, utilise la durée habituelle au lieu de ma version lente. Hmmph.

J'ai même essayé de vraiment rusé et faire:

CGFloat *durationRef = &UINavigationControllerHideShowBarDuration; 
CGFloat oldDuration = *durationRef; 
*durationRef = 2.0; 
[self.navigationController setNavigationBarHidden:value animated:YES]; 
*durationRef = oldDuration; 

Ce qui a donné lieu à un EXE _ _ BAD ACCESS sur la cession. Des idées?

Répondre

2

Si vous voulez changer la durée, vous devez mettre en œuvre la vôtre. UINavigationBar est une vue, vous pouvez saisir sa couche et la déplacer sans la vue réelle. Fondamentalement, vous faites quelque chose comme ceci:

//This routine starts animating the layer of the navigation bar off screen 
- (void)hideNavigationBar { 
    CALayer *layer = self.navigationBar.layer; 

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    animation.duration = 4.0; 
    animation.toValue = [NSNumber numberWithFloatValue:(layer.position.y - self.navigationBar.frame.size.height)]; 
    animation.delegate = self; 
    [touchedLayer addAnimation:animation forKey:@"slowHide"]; 
} 

//This is called when the animation completes. We have not yet actally 
//hidden the bar, so on redraw it will snap back into blace. We hide it 
//here before the redraw happens. 
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL) finished { 
    if (finished) { 
    [self.navigationController setNavigationBarHidden:YES animated:NO]; 
    } 
} 

L'animation de la barre arrière est semblable. Notez que cela ne modifiera pas d'autres vues à l'écran lorsque la barre se déplace, vous devrez configurer des animations séparées sur toutes les autres vues à ajuster.

Changer la vitesse demande beaucoup de travail, UIKit n'est pas configuré pour le faire, et travailler avec les animations intégrées d'Apple, c'est comme marcher dans les mines terrestres. Sauf si vous avez une raison vraiment convaincante de le faire, je pense que vous trouverez le travail pour obtenir tout ce qui se comporte correctement est bien plus que ce qu'il vaut la peine.

+0

En fin de compte j'ai décidé que reimplemebting UINavController ne valait pas le petit gain de l'élégance. Merci pour la réponse si. –

+1

Je ne pense pas que cela fonctionne. –

+0

Pourquoi pas? Vous êtes toujours libre de saisir les calques à l'écran et de commencer à attacher des animations. Pour référence, je l'ai fait en expérimentant, mais je n'ai jamais livré le code de production qui le fait. –

0

vous pouvez toujours utiliser

[UIView beginAnimations:@"FadeOutNav" context:NULL]; 
[UIView setAnimationDuration:2.0]; 
self.navigationController.navigationBar.alpha=0.0; 
[UIView commitAnimations];