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 に答える