Если вы хотите изменить продолжительность, вам нужно реализовать свою собственную. UINavigationBar - это вид, вы можете захватить его слой и перемещать его без реального вида. В основном вы делаете что-то вроде этого:
//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];
}
}
Анимация бара обратно похожа. Обратите внимание, что при перемещении панели это не будет масштабировать другие виды на экране, вам придется настраивать отдельную анимацию на любые другие виды, которые нужно настроить.
Изменение скорости - это большая работа, UIKit не настроен на это, а работать со встроенной анимацией Apple - все равно, что ходить по наземным минам. Если у вас нет действительно веской причины для этого, я думаю, вы найдете работу, чтобы заставить все вести себя правильно, намного больше, чем стоит.