1

我想让导航栏比平时隐藏得更慢。

我尝试了以下方法,但是在隐藏时,它会立即消失而不是动画出来(下面的视图确实动画正确):

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

如果我替换:

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

然后它使用通常的持续时间而不是我的慢版本。嗯。

我什至试图变得非常狡猾并做:

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

这导致了一个EXE _ BAD _ ACCESS 上的赋值。有任何想法吗?

4

2 回答 2

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 的内置动画工作就像穿过地雷一样。除非您有真正令人信服的理由这样做,否则我认为您会发现使一切正常运行的工作远远超过它的价值。

于 2009-07-19T23:32:16.577 回答
0

你仍然可以使用

[UIView beginAnimations:@"FadeOutNav" context:NULL];
[UIView setAnimationDuration:2.0];
self.navigationController.navigationBar.alpha=0.0;
[UIView commitAnimations];
于 2010-07-18T11:21:38.817 回答