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

こんな感じにしたい

facebookのナビゲーションバーはスクロールすると隠れる(ステータスバーは残る)

探してみると要望通りの動きを実現してくれそうなライブラリを発見!
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];

この記事を書いた人

kubou

kubou

2049, inc.
web業界で生活しています。
お仕事の割合はディレクション:8、開発:2くらい。