self.navigationController.hidesBarSwipe

链接地址:http://codecloud.net/15369.html

iOS 仿nice首页的navigationbar消失显示效果(hidesBarsOnSwipe) iOS 前些天产品汪找到我,滑动着nice的首页,跟我说:“小新!能否实现像nice这样的,上滑让导航栏消失,下滑让导航栏显示”。“完全可以,一行代码的事儿”我自信的回答。因为网上一搜:怎么像safari一样滑动的时候隐藏navigation bar?都会告诉你一行代码就搞定。这一行代码就是:navigationController.hidesBarsOnSwipe = Yes当然这句代码确实可以实现这个效果,我马上让产品汪看,想显示自己的能力,结果产品汪说:“是不是状态栏没有背景?状态栏不应该是透明的”。仔细对比发现:nice的状态栏不仅有个背景,而且它们navigationBar消失的时候是从状态栏显示的时间下面经过的。直接使用navigationController.hidesBarsOnSwipe = Yes的效果图如下:iOS 仿nice首页的navigationbar消失显示效果(hidesBarsOnSwipe)nice的效果图如下:iOS 仿nice首页的navigationbar消失显示效果(hidesBarsOnSwipe)iOS 仿nice首页的navigationbar消失显示效果(hidesBarsOnSwipe)到这里是不是发现“这一行代码的事儿”有点大了。很显然这一行代码搞不定了,于是乎开始想办法给状态栏添加背景,网上有一堆资料,但对这个效果一点用都没有,如果导航栏是一直显示着,可能还可以凑合着用,但现在是…无奈之下就自己“操刀了”给状态栏添加背景:在- (void)viewWillAppear:(BOOL)animated;方法中实现:UIView *statusView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, screenW, 20)];statusView.backgroundColor = [UIColor whiteColor];self.statusView = statusView;[[UIApplication sharedApplication].keyWindow addSubview:self.statusView];就这样就给状态栏添加上了背景,但是这个背景会在其它控制器中依然存在,因为我们加到了keywindow上,因为nav是透明的就会出现下面的不协调显示,让人感觉不爽。iOS 仿nice首页的navigationbar消失显示效果(hidesBarsOnSwipe)有人可能会说在首页消失的我们在- (void)viewWillDisappear:(BOOL)animated;方法中将它移出就行了。对这样可以,只需:[self.statusView removeFromSuperview];即可,倘若我们不是所有控制器都需要滑动的时候隐藏navigation bar还需加上self.navigationController.hidesBarsOnSwipe = NO;并且在- (void)viewWillAppear:(BOOL)animated;中加上self.navigationController.hidesBarsOnSwipe = YES;。这样做其它控制确实不在有这样的情况了,但是首页这个不协调的显示依然在,怎么办。那就直接禁止它透明,都设成白色的背景行了,对这样是可以的,只需self.navigationController.navigationBar.translucent = YES;即可。至此我们是给状态栏添加上背景了,也实现了像safari一样滑动的时候隐藏navigation bar。但是我们没有实现navigationBar消失的时候是从状态栏显示的时间下面经过的。这只是一个细节,实在实现不了就跟经理说,也许做成这个样子就行了。但是我们要严格要求自己,这正是我们提高能力的时候。于是乎我冒出一个想法:自己写。也就有了这篇文章的高潮部分了。首先,需要搞清楚5点。1、- (void)bringSubviewToFront:(UIView )view;的使用;2、UIScrollView 的contentOffset属性的含义;3、- (CGPoint)translationInView:(nullable UIView )view;方法的使用4、为什么一定要设置self.navigationController.navigationBar.barTintColor=[UIColor whiteColor];属性5、搞清楚UIScrollView,UITableView,navigationBar的内在联系然后再去看代码。*1、- (void)bringSubviewToFront:(UIView )view;方法可以将指定的视图推送到前面,*2、UIScrollView 的contentOffset属性的含义是:scrollview当前显示区域顶点相对于frame顶点的偏移量*3、- (CGPoint)translationInView:(nullable UIView )view;获取到的是手指移动后,在相对坐标中的偏移量*4、设置self.navigationController.navigationBar.barTintColor=[UIColor whiteColor];属性的目的:一是方便修改导航栏的背景颜色,二是我们将给navigationBar添加一个UIView控件,苹果官方文档给的解释是:The behavior of tintColor for bars has changed on iOS 7.0. It no longer affects the bar’s background and behaves as described for the tintColor property added to UIView.To tint the bar’s background, please use -barTintColor.并且这个view的背景颜色跟self.navigationController.navigationBar.barTintColor是保持一致的。*5、UIScrollView,UITableView,navigationBar的内在联系:UIScrollView是UITableView的父类,而navigationBar又在UITableView上(我是这样理解的不知道是否有错),所以只要将UIScrollView的contentOffset偏移量修改即可实现此需求。其次,来看代码。自定义个NavBarViewController继承UIViewController, NavBarViewController.h文件代码如下:  @interface NavBarViewController : UIViewController  - (void)followSwipeScrollView:(UIView *)scrollView;  @endNavBarViewController.m文件代码如下:#define NavBarFrame self.navigationController.navigationBar.frame@interface NavBarViewController ()@property (weak, nonatomic)  UIView *scrollView;

@property (strong, nonatomic) UIPanGestureRecognizer *panGesture;

@property (strong, nonatomic) UIView *overLay;

@property (assign, nonatomic) BOOL isHidden;

@end

@implementation NavBarViewController

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view.

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

//设置navigationBar跟随滚动的视图(可以是scrollView或者tableview,webview。)

-(void)followSwipeScrollView:(UIView *)scrollView

{

self.scrollView = scrollView;

self.panGesture = [[UIPanGestureRecognizer alloc] init];

self.panGesture.delegate = self;

self.panGesture.minimumNumberOfTouches = 1;

[self.panGesture addTarget:self action:@selector(handlePanGesture:)];

[self.scrollView addGestureRecognizer:self.panGesture];

self.overLay = [[UIView alloc] initWithFrame:self.navigationController.navigationBar.bounds];

self.overLay.alpha = 0;

self.overLay.backgroundColor = self.navigationController.navigationBar.barTintColor;

[self.navigationController.navigationBar addSubview:self.overLay];

[self.navigationController.navigationBar bringSubviewToFront:self.overLay];

}

#pragma mark - 兼容其他手势

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

{

return YES;

}

#pragma mark - 手势监听方法

-(void)handlePanGesture:(UIPanGestureRecognizer *)panGesture

{

CGPoint translation = [panGesture translationInView:[self.scrollView superview]];

//显示

if (translation.y >= 5) {

if (self.isHidden) {

self.overLay.alpha = 0;

CGRect navBarFrame = NavBarFrame;

CGRect scrollViewFrame = self.scrollView.frame;

navBarFrame.origin.y = 20;

scrollViewFrame.origin.y += 44;

scrollViewFrame.size.height -= 44;

[UIView animateWithDuration:0.5 animations:^{

NavBarFrame = navBarFrame;

self.scrollView.frame = scrollViewFrame;

if ([self.scrollView isKindOfClass:[UIScrollView class]]) {

UIScrollView *scrollView = (UIScrollView *)self.scrollView;

scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, scrollView.contentOffset.y + 44);

}else if ([self.scrollView isKindOfClass:[UIWebView class]]){

UIWebView *webView=(UIWebView *)self.scrollView;

webView.scrollView.contentOffset = CGPointMake(webView.scrollView.contentOffset.x, webView.scrollView.contentOffset.y + 44);

}

}];

self.isHidden = NO;

}

}

//隐藏

if (translation.y <= -20) {

if (!self.isHidden) {

CGRect frame = NavBarFrame;

CGRect scrollViewFrame = self.scrollView.frame;

frame.origin.y = -24;

scrollViewFrame.origin.y -= 44;

scrollViewFrame.size.height += 44;

[UIView animateWithDuration:0.2 animations:^{

NavBarFrame = frame;

self.scrollView.frame = scrollViewFrame;

if ([self.scrollView isKindOfClass:[UIScrollView class]]) {

UIScrollView *scrollView = (UIScrollView *)self.scrollView;

//contentOffset:scrollview当前显示区域顶点相对于frame顶点的偏移量

scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, scrollView.contentOffset.y-44);

}else if ([self.scrollView isKindOfClass:[UIWebView class]]){

UIWebView *webView=(UIWebView *)self.scrollView;

webView.scrollView.contentOffset = CGPointMake(webView.scrollView.contentOffset.x, webView.scrollView.contentOffset.y-44);

}

} completion:^(BOOL finished) {

self.overLay.alpha = 1;

}];

self.isHidden = YES;

}

}

}

-(void)viewDidAppear:(BOOL)animated{

[self.navigationController.navigationBar bringSubviewToFront:self.overLay];

}

@end

最后是使用说明:

1.将需要此效果的 UIViewController 继承NavBarViewController;

2.调用方法 [self followRollingScrollView:self.**]; //可以是scrollView或者tableview,webview。

注意:一定要设置 self.navigationController.navigationBar.barTintColor 属性。

(此方法的核心不是将navigationBar隐藏了,只是将UIScrollView的contentOffset:便宜量上移了,navigationBar也跟着上移了,而已)

至此,要其它需要实现像nice这样的navigationBar需求,只要继承NavBarViewController设置相关属性,实现相关方法即可。如有理解错误请多多指教,希望大家能共同进步。

dome地址:https://pan.baidu.com/s/1mhT7lLu

阅读原文

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • 方案一:self.navigationController.hidesBarsOnSwipe = YES; 方案二...
    lifeLL阅读 474评论 0 0
  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,441评论 1 14
  • 1.badgeVaule气泡提示 2.git终端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夹内容...
    i得深刻方得S阅读 4,526评论 1 9
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,609评论 4 59
  • 学长:学姐给你们,自习室给你们,请把食堂和操场留给我们 学姐:学长给你们,其他学姐也是你们的,请把食堂和澡堂留给我...
    月迟阅读 195评论 3 1