Изменить продолжительность анимации - PullRequest
1 голос
/ 20 июля 2009

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

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

[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 _ ДОСТУП в назначение. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 20 июля 2009

Если вы хотите изменить продолжительность, вам нужно реализовать свою собственную. 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 голосов
/ 18 июля 2010

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

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