ナビゲーションベースのアプリがあります。最初のビュー(rootcontroller)は、3つの大きなボタンのみで始まります。ナビゲーションバーはありません。そこから、他のすべてはテーブルビューであり、ナビゲーションバーがあります。私はこれをしてナビゲーションバーを表示/非表示にします:
MyAppAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.navigationController.navigationBar.hidden = NO;
ルートコントローラーを離れると、ナビゲーションバーが押し下げられるのではなく、テーブルビューの上部に移動します。テーブルビューの上部をクリップします。ルートコントローラーに戻ると、ナビゲーションバーが消える方法がスムーズではありません。ルートコントローラーのみのナビゲーションバーを非表示にするには、よりスムーズ/より良い方法がありますか?
[navigationController setNavigationBarHidden:YES animated:YES]
を使用して、バーをスムーズに非表示にできます。
この気の利いたコードは、UIの問題なくナビゲーションバーを非表示にします。
[navigationController setNavigationBarHidden: YES animated:YES]
次の方法で、ナビゲーションバーのアニメーションと期間をカスタマイズできます。アニメーションが完了すると、コールバックが提供されます。
// pass a param to describe the state change, an animated flag and a completion block matching UIView animations completion
- (void)setNavigationBarVisible:(BOOL)visible animated:(BOOL)animated completion:(void (^)(BOOL))completion {
// fail if the current state matches the desired state
if ([self navigationBarIsVisible] == visible) return completion(YES);
// get a frame calculation ready
CGFloat nheight = self.navigationController.navigationBar.frame.size.height;
CGFloat noffsetY = (visible)? -nheight : nheight;
// zero duration means no animation
CGFloat duration = (animated)? 0.3 : 0.0;
[UIView animateWithDuration:duration animations:^{
CGRect nframe = self.navigationController.navigationBar.frame;
self.navigationController.navigationBar.frame = CGRectOffset(nframe, 0, noffsetY);
} completion:completion];
}
// know the current state of the navigation bar
- (BOOL)navigationBarIsVisible {
return self.navigationController.navigationBar.frame.Origin.y < CGRectGetMinY(self.view.frame);
}
// Show or Hide navigation bar
[self setNavigationBarVisible:![self navigationBarIsVisible] animated:YES completion:^(BOOL finished) {
NSLog(@"navigation bar finished");
}];