有同志說,使用我的這個自動隱藏bar的小框架,點擊cell不能跳轉,于是對代碼進行了相應的修改,修改后的代碼將不會影響cell的點擊等其他可能出現問題,最新版的可以登錄我的github進行查看(https://github.com/ITChong/YCAutoHideOrShowBarObj ), 另外使用的方法也有所改變,請查看下圖(16/9/19更新)
這幾天不是很忙,就寫了一個非常小的小工具,使用它,我們就可以自動隱藏和顯示iOS的導航欄和TabBar欄了,也就是喵播那個隱藏導航欄和TabBar欄的效果
只需要在控制器里寫上下面一行代碼即可,如果你設置了UINavigationController屬性,沒有設置UITabBarViewController,那么就只有導航欄支持自動隱藏和顯示的效果,如果都設置了,那么都將會有自動隱藏和顯示的效果,目前的應用的需求大多數,都是要么隱藏導航欄,要么導航欄和TabBar欄都隱藏,所以目前我就只寫了這兩種情況,如果你有只隱藏TabBar欄的需求,可以告訴我,我將修改代碼,實現你要的效果
/*--------------------------> 設置自動隱藏導航欄和tabBar欄 <------------------------*/
[YCAutoHideOrShowBarObj setupNavBarorTabBarWithScrollView:self.tableView NavigationVc:self.navigationController tabBarVc:self.tabBarController];
下面是setup方法的介紹
+ (void)setupNavBarorTabBarWithScrollView:(UIScrollView *)scrollView NavigationVc:(UINavigationController *)navVc tabBarVc:(UITabBarController *)tabBarVc {
YCAutoHideOrShowBarObj *obj = [self sharedInstance];
obj.autoHideNavigationVc = navVc;
obj.autoHideTabBarVc = tabBarVc;
scrollView.delegate = obj;
}
下面是scrollView代理方法的實現
#pragma mark UIScrollViewDelegate
/**
* 開始拖拽
*/
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
self.originY = [NSNumber numberWithFloat:scrollView.contentOffset.y];
self.lastY = [NSNumber numberWithFloat:scrollView.contentOffset.y];
}
/**
* 正在拖拽
*/
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
#warning 控制器第一次顯示的時候,會調用一次這個方法,而不調用上一個方法,所以要在這里做一層判斷
if (self.lastY == nil) { // lastY 代表 上一次的contentOfset的y值
return;
}
CGFloat distance = scrollView.contentOffset.y - self.lastY.floatValue;
if (distance >= 0) {
if (self.autoHideNavigationVc.navigationBar.frame.origin.y <= -44) {
self.autoHideNavigationVc.navigationBar.transform = CGAffineTransformMakeTranslation(0, -64);
self.autoHideTabBarVc.tabBar.transform = CGAffineTransformMakeTranslation(0, 49);
return;
}
} else {
if (self.autoHideNavigationVc.navigationBar.frame.origin.y >= 20) {
self.autoHideNavigationVc.navigationBar.transform = CGAffineTransformMakeTranslation(0, 0);
self.autoHideTabBarVc.tabBar.transform = CGAffineTransformMakeTranslation(0, 0);
return;
}
}
self.lastY = [NSNumber numberWithFloat:scrollView.contentOffset.y];
if(scrollView.contentOffset.y - self.originY.floatValue > 64 && self.originY != nil) {
self.autoHideNavigationVc.navigationBar.transform = CGAffineTransformMakeTranslation(0, -64);
self.autoHideTabBarVc.tabBar.transform = CGAffineTransformMakeTranslation(0, 49);
} else if(self.originY.floatValue - scrollView.contentOffset.y > 64 && self.originY != nil){
self.autoHideNavigationVc.navigationBar.transform = CGAffineTransformIdentity;
self.autoHideTabBarVc.tabBar.transform = CGAffineTransformIdentity;
} else {
self.autoHideNavigationVc.navigationBar.transform = CGAffineTransformTranslate(self.autoHideNavigationVc.navigationBar.transform, 0, -distance);
self.autoHideTabBarVc.tabBar.transform = CGAffineTransformTranslate(self.autoHideTabBarVc.tabBar.transform, 0, distance);
}
}
/**
* 拖拽完了
*/
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
[self hideOrHiddenNavBar:scrollView];
self.lastY = nil;
self.originY = nil;
}
/**
* 減速完了
*/
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
[self hideOrHiddenNavBar:scrollView];
self.lastY = nil;
self.originY = nil;
}
/**
* 拖拽都停止了,調用這個方法,判斷顯示和隱藏
*/
- (void)hideOrHiddenNavBar:(UIScrollView *)scrollView {
CGFloat navY = self.autoHideNavigationVc.navigationBar.frame.origin.y;
if (navY == 20 || navY == -44) {
return;
}
if (navY > -11) {
[UIView animateWithDuration:0.3 animations:^{
self.autoHideNavigationVc.navigationBar.transform = CGAffineTransformMakeTranslation(0, 0);
self.autoHideTabBarVc.tabBar.transform = CGAffineTransformMakeTranslation(0, 0);
}];
} else {
[UIView animateWithDuration:0.3 animations:^{
self.autoHideNavigationVc.navigationBar.transform = CGAffineTransformMakeTranslation(0, -64);
self.autoHideTabBarVc.tabBar.transform = CGAffineTransformMakeTranslation(0, 49);
}];
if (scrollView.contentOffset.y < 0) {
[scrollView setContentOffset:CGPointMake(0, 0)];
}
}
}
采用單利模式來創建對象,然后讓obj對象成為傳進來的tableView的代理,就可以在代理方法中,監聽scrollView的拖拽了,通過代理方法,檢測手滑動的位置來判斷bar的顯示和隱藏(修改的它們的transform屬性
)。具體的實現內容,可以查看我的demo:https://github.com/ITChong/YCAutoHideOrShowBarObj,有bug了,歡迎提出來
歡迎給星