更改动画持续时间

时间:2009-07-19 22:39:22

标签: iphone uiview uinavigationcontroller uinavigationbar

我希望导航栏的隐藏速度比平常慢。

我尝试了以下操作,但是在隐藏时,它会立即消失而不是动画显示(下面的视图会正确显示动画):

[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 个答案:

答案 0 :(得分: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的内置动画工作就像走过地雷一样。除非你有一个非常令人信服的理由去做,否则我认为你会发现让一切行为正常的工作远远超过它的价值。

答案 1 :(得分:0)

你仍然可以使用

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