kubou.dev();

好きな言葉は一石二鳥

iOS7 - スクロールでステータスバーは残しつつ、ナビゲーションバーは隠す動きを実現。

Facebookアプリみたいに、下にスクロールするとナビゲーションバー「だけ」を隠したい。 少しハマったのでメモ。 #普通に実装してるとステータスバーまで消えてしまった。それは意図した動きではない。

こんな感じにしたい [caption id="attachment_219" align="aligncenter" width="639"]facebookのナビゲーションバーはスクロールすると隠れる(ステータスバーは残る) facebookのナビゲーションバーはスクロールすると隠れる(ステータスバーは残る)[/caption]
探してみると要望通りの動きを実現してくれそうなライブラリを発見! https://github.com/luugiathuy/GTScrollNavigationBar

実装方法は以下の通り。

// AppDelegate.h
#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UINavigationController *navController;
@property (strong, nonatomic) UIViewController* viewController;
// AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.viewController = [[MasterViewController alloc] initWithStyle:UITableViewStylePlain];
    self.navController = [[UINavigationController alloc] initWithNavigationBarClass:[GTScrollNavigationBar class]
                                                                       toolbarClass:nil];
    [self.navController setViewControllers:@[self.viewController] animated:NO];
    self.window.rootViewController = self.navController;
    [self.window makeKeyAndVisible];
    
    return YES;
}
// MasterViewController.m
#import "GTScrollNavigationBar.h"

- (void)viewWillAppear:(BOOL)animated
{
    self.navigationController.scrollNavigationBar.scrollView = self.tableView;
}

- (void)viewWillDisappear:(BOOL)animated
{
    self.navigationController.scrollNavigationBar.scrollView = nil;
}

- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView
{
    [self.navigationController.scrollNavigationBar resetToDefaultPosition:YES];
}

基本的にはこれで動作します。 実装が終わったnavigationBarにrightBarButtonItem等をのせて画面遷移したい場合は、pushViewControllerをこんな風にする必要があります。

// self.storyboardがnilになるので、明示的にインスタンスを生成する。
storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
NextViewController* next = [storyboard instantiateViewControllerWithIdentifier:@"Next"];
[self.navigationController pushViewController:next animated:YES];