2009-07-19 7 views
1

Я бы хотел, чтобы панель навигации скрывалась медленнее, чем обычно.Изменение продолжительности анимации

Я попытался следующие, но когда скрывается, она исчезает мгновенно вместо анимации из (вид снизу делает анимацию правильно):

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

Если бы я суррогат:

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

Тогда использует обычную продолжительность вместо моей медленной версии. Hmmph.

Я даже пытался получить действительно коварен и сделать:

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

Что привело к EXE _ _ BAD ACCESS на уступки. Есть идеи?

ответ

2

Если вы хотите изменить продолжительность своей реализации, вам нужно выполнить ее. 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 похожа на прогулку по наземным минам. Если у вас нет действительно веских оснований для этого, я думаю, вы найдете, что работа над тем, чтобы все было правильно, намного больше, чем того стоит.

+0

В конце концов я решил, что reimplemebting UINavController не стоит небольшой выигрыш в элегантности. Спасибо за ответ, хотя. –

+1

Я не думаю, что это работает. –

+0

Почему бы и нет? Вы всегда можете захватить слои на экране и начать прикреплять анимации. Для справки, я сделал это во время экспериментов, но я никогда не отправлял производственный код, который делает это. –

0

вы все еще можете использовать

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