渐变导航条实现(根据ScrollView的滚动改变导航条透明度和颜色)

渐变.gif

地址:https://github.com/huberyhx/HXChangeNavigationBar.git

实现过程简介:

  • 界面组成:
    底部是TableView(占据控制器的整个View)
    顶部的一个View以及其内部的两个ImageView
    中间的红色分隔条View

  • 控件约束:
    tableView:距上下左右均为0,与控制器View等大
    顶部View:距上左右为0,然后定高(控制器需要获得这个高属性来修改它)
    顶部View内部第一个ImageView:距上下左右均为0,与顶部View等大,拥有下拉放大效果显示模式应该选择UIViewContentModeScaleAspectFill(关于ImageView的图片显示模式,请见我的另一篇文章:http://www.jianshu.com/p/d38d3e6f3db4)
    顶部View内部第二个ImageView:在父控件中水平居中,距下40,定高定宽(不会缩小变形)
    红色分隔条View:紧贴顶部View,距左右为0,定高44

  • 设计思路:

首先要知道设置导航条的透明度是不能让导航条的透明度发生变化的(无效)
所以我们设置导航条背景图的透明度,来实现导航条看上去透明了的效果
另外导航条还有一个ShadowImage(直接隐藏掉好了)
是导航条下面的那根线:


BackgroundImage和ShadowImage.png

初始状态如下设置:

.
//设置tableView的contentInset 让tableView的第一行从红色View下部开始显示
    self.tableView.contentInset = UIEdgeInsetsMake(244, 0, 0, 0);
.
//设置无颜色ImageView给navigationBar,实现navigationBar透明效果
    [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc]init] forBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setShadowImage:[[UIImage alloc]init]];//导航条图片下面的线
.
//设置标题
    UILabel *title = [[UILabel alloc] init];
    title.text = @"我在渐变";
    [title sizeToFit];
    title.textColor = [UIColor colorWithWhite:0 alpha:0];
    self.navigationItem.titleView = title;

然后在ScrollView的滚动监听方法里面根据TableView滚动了多少来改变图片透明度:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
//一堆计算过程:
    CGFloat offset = scrollView.contentOffset.y - originY;
    //当前值 - 原始值 = 偏移量
    CGFloat h = originH - offset;
    if (h<64) {
        h = 64;
    }
    
    CGFloat alpha = offset * 1 / 136.0;
    if (alpha >=1) {
        alpha = 0.99;
    }
//计算结束
.
    //修改顶部View的高度
    self.viewHeight.constant = h;

    //拿到标题 设置标题透明度
    UILabel *titleL = (UILabel *)self.navigationItem.titleView;
    titleL.textColor = [UIColor colorWithWhite:0 alpha:alpha];
  
    //修改导航栏的背景图片
    //把颜色生成图片
    UIColor *alphaColor = [UIColor colorWithWhite:1 alpha:alpha];
    //把颜色生成图片
    UIImage *alphaImage = [self imageWithColor:alphaColor];
    //修改导航条背景图片
    [self.navigationController.navigationBar setBackgroundImage:alphaImage forBarMetrics:UIBarMetricsDefault];
}
//根据颜色来生成一张图片
-(UIImage *)imageWithColor:(UIColor *)color
{
    // 描述矩形
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    // 开启位图上下文
    UIGraphicsBeginImageContext(rect.size);
    // 获取位图上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    // 使用color演示填充上下文
    CGContextSetFillColorWithColor(context, [color CGColor]);
    // 渲染上下文
    CGContextFillRect(context, rect);
    // 从上下文中获取图片
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
    // 结束上下文
    UIGraphicsEndImageContext();
    return theImage;
}

感谢阅读
你的支持是我写作的唯一动力

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,547评论 1 14
  • 1、禁止手机睡眠[UIApplication sharedApplication].idleTimerDisabl...
    DingGa阅读 1,144评论 1 6
  • 今天的晨读分享的是《非暴力沟通》,猫叔说书里三个神奇的沟通法则,可迅速提升你的言值。 这本书其实在昨天的赵周老师的...
    娜娜_51cf阅读 396评论 5 3
  • 莫名其妙的 在编译时 遇到这个错误,试过多种方法以后,找到原因。因为 更改或 lock 或 unlock 过登录钥...
    天亮的曙光阅读 1,373评论 0 0
  • 一 作者:沈虹 文章:丑哥和猫 点评:王雪梅 三岁的猫,四岁的丑哥,想想就很可爱。作者细节描述引人入胜!继续加油儿...
    苏醒7阅读 161评论 0 0