iOS之导航栏的渐变隐藏及显示

在项目中往往有的时候需要导航栏的状态是变化的,有的时候需要隐藏,为的是显示更多的页面,有的时候需要显示出来,给用户以提示,所以就需要隐藏和显示导航栏。正如下面的示意图所示:


示意图

分析

本个项目中,展示的是一个导航控制器,其中导航控制器中有个UIViewController或者是UITableviewController为根控制器的这么一个结构。

实现

因此在storyboard中我们将之前控制器删除,然后拖一个导航控制器出来,然后试着先绑定一个UITableviewController为根控制器。

导航栏的设置

为了让我们的header view所展示的位置是在左上角的圆点位置,我们需要把自动偏移设置关掉。

    self.automaticallyAdjustsScrollViewInsets = NO;

下面就需要隐藏导航栏操作了,我们都知道导航栏有一个隐藏的属性,下面试试

    self.navigationController.navigationBar.hidden = YES;

这种方法虽然能够让导航栏消失隐藏掉,但是如果我们要进行滚动tableview的时候,就不能让导航栏渐变的显示出来,所以这种方法不能满足要求。
这种方法行不通那么用透明度的方案来试试:

    self.navigationController.navigationBar.alpha = 0;

截图如下:


导航栏没有消失掉

因此上面的方案不能实现功能。
可以使用设置导航栏背景图片进行设置,这样就可以设置导航栏的背景有个透明度的变化。

    [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];

当传入的图片为nil的时候,会自动的创建一个半透明的图片作为导航栏的背景。所以这种方案是可行的,但是导航栏下面的那一根线我们是希望不显示的:

    [self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];

这样一来,导航栏的那根线就取消掉了。
以上导航栏的基本实现方案已经确定了,但是下面的列表的显示还有些疑问,到底是用的tableview显示,利用tableview的headerView;还是用UIViewController进行展示头部的控件,下面的部分就用tableview进行展示。

UITableviewController 方案

我们先试着作出示意图的效果,一个tableview上放置一个headerView。

    UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 200)];
    header.backgroundColor = [UIColor redColor];
    self.tableView.tableHeaderView = header;

运行下,看效果:

tableview header方案

看示意图,我们可以看到整个tableview都在移动,而不是我们效果图那种的样式,在往下滚动的时候,头部的控件是不会网下移动的,但是利用tableview的headerView进行布局的方案是不成功的。

UIViewController 方案

我们首先在view上放置一个tableview和UIView(放置头部的那些图片)。

页面的层级

以上都是在storyboard中操作的。


UIViewController方案添加header

以上的效果图中可以看到头部的headerView没有类似于tableview的headerView那种滚动的时候出现下移的情况。所以这种方式是可行的。
但是我们还需要设置tableview的偏移量,因为图片的显示,遮挡住了我们的列表,所以需要设置一个偏移量:

    self.tableView.contentInset = UIEdgeInsetsMake(244, 0, 0, 0);

导航栏的一些细节处理

导航栏的文字,在刚开始出现的时候是需要隐藏掉的,

    //设置标题
    UILabel *title = [[UILabel alloc] init];
    title.text = @"个人主页";
    [title sizeToFit];
    // 开始的时候看不见,所以alpha值为0
    title.textColor = [UIColor colorWithWhite:0 alpha:0];
    self.navigationItem.titleView = title;

虽然我们已经把文字隐藏掉了,但是已进入到控制器,我们还是能看到导航栏,所以我们需要在进入到控制器的时候隐藏掉,就在storyboard中进行设置就可以了,选中控制器:


隐藏导航栏

把top Bar的设置改为None就可以了。

实现滚动隐藏或显示导航栏

我们知道tableview是继承自scrollView的,所以有个-scrollViewDidScroll:方法中可以拿到tableview的滚动。而且当调用contentInset会自动调用-scrollViewDidScroll:
我们可以这个方法中监听到scrollView的偏移量:

#pragma mark - scrollview
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSLog(@"%f", scrollView.contentOffset.y); //  原始偏移的位置是-244
}

所以导航栏的一些控制操作就在这个方法中进行实现。
我们需要注意到的是,当整个页面上移到一定的位置的时候,就不在上移了,因为需要留够64的位置给导航栏进行显示。也就是说这个显示图片这部分上移到一定的位置就不在移动了。
我们需要改变这个控件的高度,那么就需要修改这个控件高度的约束,所以就需要拖个约束到控制器中。

// 头部展示高度约束
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *imageHeight;

计算头部的高度:

    CGFloat offset = scrollView.contentOffset.y - oriOfftY;
    CGFloat imgH = oriHeight - offset;
    if (imgH < 64) {
        // 当上移到距离顶部小于64的时候,就不在移动了。
        imgH = 64;
    }
    self.imageHeight.constant = imgH;
上移、下移
到此我们就需要处理透明度渐变的问题了。

由效果图可以知道,整个页面上移到一定的距离,就会完全显示出导航栏,下移一定的距离,导航栏就会消失掉。

    //透明度
    //找最大值/
    CGFloat alpha = offset * 1 / 136.0;   // (200 - 64) / 136.0f
    if (alpha >= 1) {
        // 透明度最大值
        alpha = 0.99;
    }

设置文字:

    //拿到标题 标题文字的随着移动高度的变化而变化
    UILabel *titleL = (UILabel *)self.navigationItem.titleView;
    titleL.textColor = [UIColor colorWithWhite:0 alpha:alpha];

最后一步就是修改导航栏的背景的渐变效果:

    //把颜色生成图片
    UIColor *alphaColor = [UIColor colorWithWhite:1 alpha:alpha];
    //把颜色生成图片
    UIImage *alphaImage = [UIImage imageWithColor:alphaColor];
    //修改导航条背景图片
    [self.navigationController.navigationBar setBackgroundImage:alphaImage forBarMetrics:UIBarMetricsDefault];

-imageWithColor :这个方法是UIImage的一个分类中的方法,专门就是把颜色转换成图片的方法:

// 颜色转为图片
+ (UIImage *)imageWithColor:(UIColor *)color {
    CGRect rect = CGRectMake(0, 0, 1.0f, 1.0f);
    // 开启位图上下文
    UIGraphicsBeginImageContext(rect.size);
    // 开启上下文
    CGContextRef ref = UIGraphicsGetCurrentContext();
    // 使用color演示填充上下文
    CGContextSetFillColorWithColor(ref, color.CGColor);
    // 渲染上下文
    CGContextFillRect(ref, rect);
    // 从上下文中获取图片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    // 结束上下文
    UIGraphicsEndImageContext();
    return image;
}

以上基本完成了想要的效果图的功能了。
代码传送门,如果有帮助你的话,GitHub上给个赞呗!

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,983评论 4 60
  • 大家好,我今天想说说a的故事。 希望能对一些人能有一些小小的帮助。 a并不是什么大人物,只是一个普通得不能再普通的...
    imBarbara阅读 141评论 0 0
  • 马背上的民族, 弓箭,牧羊,滚打,食肉 草原上的群狼, 忍耐,智慧,协作,奔放 狼守护着草原, 控制黄羊的数量,避...
    月亭阅读 495评论 12 8