スクロールビューにナビゲーションバーが1つあります。(StoryBoardを使用)
ユーザーがビューをタップしたときにナビゲーションバーを非表示にします。
ユーザーがもう一度タップすると、ナビゲーションバーが表示されます。
どうすればそれを作ることができますか?
質問する
1150 次
1 に答える
3
ナビゲーションバー(コントローラーなし)を使用している場合は、ナビゲーションバーのフレームの変更と、スクロールビューのフレームの変更をアニメーション化する必要があります。以下の例では、ナビゲーションバーを画面の上部から移動し、それに応じてスクロールビューのサイズを調整しています。明らかにIBOutlet
、ナビゲーションバーとスクロールビューの両方の参照が必要です。
@interface ViewController ()
@property (nonatomic) BOOL navigationBarHidden;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationBarHidden = NO;
UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[self.scrollView addGestureRecognizer:gesture];
}
- (void)handleTap:(id)sender
{
[UIView animateWithDuration:0.5
animations:^{
CGRect navBarFrame = self.navBar.frame;
CGRect scrollViewFrame = self.scrollView.frame;
if (self.navigationBarHidden)
{
navBarFrame.origin.y += navBarFrame.size.height;
scrollViewFrame.size.height -= navBarFrame.size.height;
}
else
{
navBarFrame.origin.y -= navBarFrame.size.height;
scrollViewFrame.size.height += navBarFrame.size.height;
}
self.scrollView.frame = scrollViewFrame;
self.navBar.frame = navBarFrame;
self.navigationBarHidden = !self.navigationBarHidden;
}];
}
@end
自動レイアウトを使用している場合は少し異なりますが(制約の変更をアニメーション化する必要があります)、基本的な考え方は同じです。iOS 6以降のみを対象としていて、自動レイアウトを使用している場合はお知らせください。
ナビゲーションコントローラーを使用している場合は、次のコマンドで非表示にできるため、少し簡単ですsetNavigationBarHidden
。
[self.navigationController setNavigationBarHidden:YES animated:YES];
あなたはで示すことができます:
[self.navigationController setNavigationBarHidden:NO animated:YES];
タップでこれを実行したい場合は、次のようにすることができます(これにはIBOutlet
スクロールビューが必要です)。
- (void)viewDidLoad
{
[super viewDidLoad];
UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[self.scrollView addGestureRecognizer:gesture];
}
- (void)handleTap:(id)sender
{
BOOL hidden = self.navigationController.navigationBarHidden;
[self.navigationController setNavigationBarHidden:!hidden animated:YES];
}
于 2013-02-06T23:15:32.670 に答える