iOS实现简易的导航栏颜色渐变实例代码

2025-05-29 0 66

前言

很多app首页要做成类似天猫和京东的导航栏,实现在页面滑动过程中导航栏渐变的效果。笔者之前在项目里用过一个三方,后来更新版本失效了,于是决定结合自己对导航栏的认识来实现一下这个功能。完成一个简易的ios导航栏颜色渐变方案。

【文末附运行效果及demo】,下面话不多说了,来一起看看详细的介绍吧

思考与原理

如何给导航栏设置颜色

?

1

2

3

4

5
//方法一

self.navigationcontroller.navigationbar.backgroundcolor = [uicolor redcolor];

//方法二

[self.navigationcontroller.navigationbar setbackgroundimage:[uiimage imagenamed:@"red.png"] forbarmetrics:uibarmetricsdefault];

以上两个方法都可以为导航栏添加颜色,但是方法一的效果并非此处所需。

iOS实现简易的导航栏颜色渐变实例代码

直接设置背景色的效果

原因在于 uinavigationbar 的结构中添加了 uiview 、 uiimageview 、 uilabel等控件,覆盖了 uinavigationbar 。

方法二的效果符合预期。

iOS实现简易的导航栏颜色渐变实例代码

uinavigationbar结构图

如何将颜色转换为图片?

直接贴代码并附上注释:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17
- (uiimage *)imagewithcolor:(uicolor *)color {

//创建1像素区域并开始图片绘图

cgrect rect = cgrectmake(0, 0, 1, 1);

uigraphicsbeginimagecontext(rect.size);

//创建画板并填充颜色和区域

cgcontextref context = uigraphicsgetcurrentcontext();

cgcontextsetfillcolorwithcolor(context, [color cgcolor]);

cgcontextfillrect(context, rect);

//从画板上获取图片并关闭图片绘图

uiimage *image = uigraphicsgetimagefromcurrentimagecontext();

uigraphicsendimagecontext();

return image;

}

如何在滑动时为导航栏设置背景?

通常展示信息页面都存在滑动视图(uitableview 、 uicollectionview 等),这就不难想到可以在滑动视图的 scrollviewdidscroll 这个方法里根据滑动视图纵向偏移量来计算颜色的透明度的。

实现

除了以上的问题思考和基本原理,实际实现过程中还有一些需要注意的内容。

导航栏的隐藏与显示

当页面下拉时隐藏导航栏,方法有两个:

?

1

2

3

4

5
//方法一:

[self.navigationcontroller setnavigationbarhidden:yes];

//方法二:

self.navigationcontroller.navigationbar.hidden = yes;

以上两个方法效果相同,区别在于一个是操作 navigationcontroller 的属性(navigationbar 是 navigationcontroller的一个属性),一个是操作navigationbar的属性。

但是,方法一会出现一个bug,就是当页面初始状态时 setnavigationbarhidden 为 yes,也就相当于 navigationbar 那一刻是不存在的,那么导航栏上的控件也就自然看不到,而且 navigationbar的出现和消失会很突兀。

采用方法二效果会好很多,因为navigationbar本身是存在的,只是做了显示和隐藏的操作,过渡也相对顺滑很多。

页面切换的处理

导航栏作为的公共区域,我们可以对它进行自定义,同时也要考虑当前页面的导航栏和其他页面导航栏之间的相互影响。

  • 导航栏下面那条线其实是一张图片,叫做 shadowimage,在 viewwillappear对其隐藏,又在 viewwilldisappear对其做了还原。
  • 页面即将呈现时防止其他页面回来其他页面设置的导航栏背景色对本页面造成影响,在 viewwillappear 对导航栏背景色先做了置空处理。
  • 为了保证回到该页面时导航栏颜色和离开时保持一致,在页面即将呈现时手动调了一下 scrollviewdidscroll 方法来计算当前应该呈现的颜色

封装

为了方便使用,封装一个 uinavigationbar的category: uinavigationbar+changecolor。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22
//uinavigationbar+changecolor.m文件

//核心方法

- (void)changecolor:(uicolor *)color withoffsety:(cgfloat)offsety {

if (offsety < 0) {

//下拉时导航栏隐藏

self.hidden = yes;

}else {

self.hidden = no;

//计算透明度,180为随意设置的偏移量临界值

cgfloat alpha = offsety / 180 > 1.0f ? 1 : (offsety / 180);

//设置一个颜色并转化为图片

uiimage *image = [self imagewithcolor:[color colorwithalphacomponent:alpha]];

[self setbackgroundimage:image forbarmetrics:uibarmetricsdefault];

self.translucent = alpha >= 1.0f ? no : yes;

}

}

使用方法:

  • star:隐藏导航栏下的横线,将背景色置空,一般在viewwillappear中调用,;
  • changecolor:withscrollview:andvalue: :传入颜色、滑动视图、临界值来实现,一般在 scrollviewdidscroll中调用;
  • reset:显示导航栏下横线,还原导航栏,一般在 viewwilldisappear中调用。
?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23
//vc.m文件

/* 页面即将显示 */

- (void)viewwillappear:(bool)animated {

[super viewwillappear:animated];

[self.navigationcontroller.navigationbar start];

//该页面呈现时手动调用计算导航栏此时应当显示的颜色

[self scrollviewdidscroll:_tableview];

}

/* 页面即将消失 */

- (void)viewwilldisappear:(bool)animated {

[super viewwilldisappear:animated];

[self.navigationcontroller.navigationbar reset];

}

/* 滑动过程中做处理 */

- (void)scrollviewdidscroll:(uiscrollview *)scrollview {

[self.navigationcontroller.navigationbar changecolor:[uicolor redcolor] withoffsety:scrollview.contentoffset.y];

}

效果展示

完整demo

总结

  • 由于系统自带的导航栏经常不能满足需求,因此在开发中导航栏经常需要自定义,哪怕只是修改背景色。
  • 了解导航栏的结构处理起来会更容易。
  • 自定义导航栏也要考虑和其他页面的导航栏之间的相互影响。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对快网idc的支持。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 iOS实现简易的导航栏颜色渐变实例代码 https://www.kuaiidc.com/89270.html

相关文章

发表评论
暂无评论