2009-07-19 12 views
1

Ich möchte die Navigationsleiste langsamer als üblich ausblenden.Ändern Animationsdauer

ich folgende versucht, aber wenn versteckt, verschwindet es sofort statt Animieren aus (die Ansicht unten richtig funktioniert animieren up):

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

Wenn ich Ersatz:

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

es dann verwendet die übliche Dauer anstelle meiner langsamen Version. Hmmm.

Ich habe sogar versucht, wirklich schlau zu bekommen und zu tun:

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

, die in einer EXE über die Zuordnung _ _ BAD ACCESS geführt. Irgendwelche Ideen?

Antwort

2

Wenn Sie die Dauer ändern möchten, müssen Sie Ihre eigene implementieren. UINavigationBar ist eine Ansicht. Sie können ihre Ebene auswählen und sie ohne die aktuelle Ansicht verschieben. Im Grunde tun Sie etwas wie folgt:

//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]; 
    } 
} 

Animieren der Bar zurück in ist ähnlich. Beachten Sie, dass dadurch keine anderen Ansichten auf dem Bildschirm skaliert werden, wenn sich die Leiste bewegt. Sie müssen separate Animationen für alle anderen Ansichten einrichten, die angepasst werden müssen.

Das Ändern der Geschwindigkeit ist eine Menge Arbeit, UIKit ist nicht eingerichtet, um es zu tun, und das Arbeiten um Apples eingebaute Animationen ist wie durch Landminen gehen. Es sei denn, Sie haben einen wirklich zwingenden Grund, es zu tun, ich denke, dass Sie die Arbeit finden werden, um alles richtig zu bekommen, ist viel mehr, als es wert ist.

+0

Am Ende verwenden kann ich entschieden, dass UINavController reimplemebting die kleinen Gewinn in Eleganz nicht wert war. Danke für die Antwort. –

+1

Ich glaube nicht, dass das funktioniert. –

+0

Warum nicht? Sie können immer die Ebenen auf dem Bildschirm auswählen und Animationen hinzufügen. Als Referenz habe ich dies während des Experimentierens gemacht, aber ich habe nie Produktionscode geliefert, der dies tut. –

0

Sie noch

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