2

スクロールビューにナビゲーションバーが1つあります。(StoryBoardを使用)
ユーザーがビューをタップしたときにナビゲーションバーを非表示にします。
ユーザーがもう一度タップすると、ナビゲーションバーが表示されます。
どうすればそれを作ることができますか?

4

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