服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS仿新闻tab标题栏效果

iOS仿新闻tab标题栏效果

2021-05-03 17:04踏莎行hyx IOS

这篇文章主要为大家详细介绍了iOS仿新闻tab标题栏效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

ios仿网易新闻之类的滑动标题栏,供大家参考,具体内容如下

预览

iOS仿新闻tab标题栏效果

思路

两个scorllview,一个用于标题栏,一个拥有底下的page
标题栏文字和效果切换,渐变色和大小都是根据底下的page偏移量来归一化换算的
小横线直接加载标题栏所在的scorllview里面,小横线自身要有局部偏移,根据page来切换
标题栏的居中需要算一个scrollview的偏移量,小横线跟着scorllview偏移
监听scrollview的滑动和停止滑动进行相应的处理

?
<table border="0" cellpadding="0" cellspacing="0">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
- (void)viewdidload
{
 [super viewdidload];
 // do any additional setup after loading the view.
 [self createtitlescrollview];
 [self createbuttonline];
 [self createcontentscrollview];
}
 
#pragma mark - 初始化ui
- (void)createtitlescrollview
{
 // 根据是否有导航栏调整坐标
 cgfloat marginy = self.navigationcontroller ? self.navigationcontroller.view.frame.size.height : kupmargin;
 
 // 标题栏,包括小横线的位置
 _titlescrollview = [[uiscrollview alloc] initwithframe:cgrectmake(0, marginy, kframewidth, ktitleheight + kbuttonlineheight)];
 _titlescrollview.showshorizontalscrollindicator = no;
 _titlescrollview.bounces = no;
 _titlescrollview.delegate = self;
 [self.view addsubview:_titlescrollview];
 
 // 添加button
 nsarray *titlearray = @[@"头条", @"社会", @"财经", @"科技", @"体育", @"娱乐", @"时尚", @"军事", @"教育", @"游戏"];
 _pagecount = titlearray.count;
 _titlescrollview.contentsize = cgsizemake(kbuttonwidth * _pagecount, ktitleheight);
 for (int i = 0; i < _pagecount; i++)
 {
  uibutton *titlebtn = [[uibutton alloc] initwithframe:cgrectmake(kbuttonwidth * i, 0, kbuttonwidth, ktitleheight)];
  [titlebtn settitle:titlearray[i] forstate:uicontrolstatenormal];
  [titlebtn settitlecolor:[uicolor blackcolor] forstate:uicontrolstatenormal];
  titlebtn.titlelabel.font = [uifont systemfontofsize:16];
  [titlebtn addtarget:self action:@selector(titlebuttonclicked:) forcontrolevents:uicontroleventtouchdown];
  titlebtn.tag = 1000 + i; // button做标记,方便后面索引,为了不出冲突,就把这个数值设得大一些
  [_titlescrollview addsubview:titlebtn];
 };
}
 
- (void)createbuttonline
{
 // 初始时刻停在最左边与按钮对齐
 _buttonline = [[uiview alloc] initwithframe:cgrectmake(0, ktitleheight, kbuttonwidth, kbuttonlineheight)];
 _buttonline.backgroundcolor = [uicolor redcolor];
 // 小横线加载scrollview上才能跟随button联动
 [_titlescrollview addsubview:_buttonline];
}
 
- (void)createcontentscrollview
{
 cgfloat marginy = self.navigationcontroller ? self.navigationcontroller.view.frame.size.height : kupmargin;
 
 // 添加内容页面
 _contentscrollview = [[uiscrollview alloc] initwithframe:cgrectmake(0, marginy + ktitleheight + kbuttonlineheight, kframewidth, kframeheight - marginy - ktitleheight - kbuttonlineheight)];
 _contentscrollview.pagingenabled = yes;
 _contentscrollview.bounces = no;
 _contentscrollview.contentsize = cgsizemake(kframewidth * _pagecount, kframeheight - marginy - ktitleheight);
 _contentscrollview.showshorizontalscrollindicator = no;
 _contentscrollview.delegate = self;
 [self.view addsubview:_contentscrollview];
 
 // 添加分页面
 for (int i = 0; i < _pagecount; i++)
 {
  pageviewcontroller *pageviewcontroller = [[pageviewcontroller alloc] init];
  uibutton *button = [_titlescrollview viewwithtag:1000 + i];
  pageviewcontroller.title = button.currenttitle;
  pageviewcontroller.view.frame = cgrectmake(kframewidth * i, 0, kframewidth, kframeheight - marginy - ktitleheight);
  [_contentscrollview addsubview:pageviewcontroller.view];
 }
 
 // 初始化后选中某个栏目
 [self titlebuttonclicked:[_titlescrollview viewwithtag:1000 + 0]];
}
 
#pragma mark - 标题button点击事件
- (void)titlebuttonclicked:(uibutton *)sender
{
 // 根据点击的button切换页面和偏移
 printf("%s clicked\n", sender.currenttitle.utf8string);
 
 // 以下不用了,因为scroll切换会自动处理好尺寸和颜色了
// for (int i = 0; i < _pagecount; i++)
// {
//  uibutton *button = [_titlescrollview viewwithtag:1000 + i];
//  // 重置button尺寸颜色
//  button.transform = cgaffinetransformmakescale(1, 1);
//  [button settitlecolor:[uicolor blackcolor] forstate:uicontrolstatenormal];
// }
 
 // 强调被选中的button
 // 放大聚焦
 sender.transform = cgaffinetransformmakescale(kmaxtitlescale, kmaxtitlescale);
 // 变色
 [sender settitlecolor:[uicolor greencolor] forstate:uicontrolstatenormal];
 
 // 居中title
 [self settletitlebutton:sender];
 
 // 带动画切换到对应的内容,会触发scrollviewdidscroll
 nsinteger pageindex = sender.tag - 1000;
 [_contentscrollview setcontentoffset:cgpointmake(kframewidth * pageindex, 0) animated:yes];
}
 
#pragma mark - scrollview滑动事件
- (void)scrollviewdidscroll:(uiscrollview *)scrollview
{
 // 根据content内容偏移调整标题栏
 if (scrollview == _titlescrollview)
 {
  printf("title moved\n");
  
  
 }
 else if (scrollview == _contentscrollview)
 {
  printf("content moved\n");
  
  // 获得左右两个button的索引, 注意最后取整
  cgfloat offsetx = scrollview.contentoffset.x;
  nsinteger lefttitleindex = offsetx / kframewidth;
  nsinteger righttitleindex = lefttitleindex + 1;
  // 因为设置了到边不能滑动,所以不考虑边界
  uibutton *lefttitlebutton = [_titlescrollview viewwithtag:1000 + lefttitleindex];
  uibutton *righttitlebutton = [_titlescrollview viewwithtag:1000 + righttitleindex];
  
  // 设置大小和颜色渐变以及小横线的联动
  // 权重因子 0~1 小数, 左边和右边互补
  cgfloat righttitlefactor = offsetx / kframewidth - lefttitleindex;
  cgfloat lefttitlefactor = 1 - righttitlefactor;
  
  // 尺寸
  cgfloat maxextrascale = kmaxtitlescale - 1;
  lefttitlebutton.transform = cgaffinetransformmakescale(1 + lefttitlefactor * maxextrascale, 1 + lefttitlefactor * maxextrascale);
  righttitlebutton.transform = cgaffinetransformmakescale(1 + righttitlefactor * maxextrascale, 1 + righttitlefactor * maxextrascale);
  // 颜色
  uicolor *lefttitlecolor = [uicolor colorwithred:0 green:lefttitlefactor blue:0 alpha:1];
  uicolor *righttitlecolor = [uicolor colorwithred:0 green:righttitlefactor blue:0 alpha:1];
  [lefttitlebutton settitlecolor:lefttitlecolor forstate:uicontrolstatenormal];
  [righttitlebutton settitlecolor:righttitlecolor forstate:uicontrolstatenormal];
  // 小横线位移
  _buttonline.frame = cgrectmake(kbuttonwidth * (lefttitleindex + righttitlefactor), _buttonline.frame.origin.y, kbuttonwidth, kbuttonlineheight);
 }
}
 
- (void)scrollviewdidenddecelerating:(uiscrollview *)scrollview
{
 // 内容区块滑动结束调整标题栏居中
 if (scrollview == _contentscrollview)
 {
  // 取得索引值
  nsinteger titleindex = scrollview.contentoffset.x / kframewidth;
  // title居中
  [self settletitlebutton:[_titlescrollview viewwithtag:1000 + titleindex]];
 }
}
 
#pragma mark - 标题按钮和横线居中偏移
- (void)settletitlebutton:(uibutton *)button
{
 // 标题
 // 这个偏移量是相对于scrollview的content frame原点的相对对标
 cgfloat deltax = button.center.x - kframewidth / 2;
 // 设置偏移量,记住这段算法
 if (deltax < 0)
 {
  // 最左边
  deltax = 0;
 }
 cgfloat maxdeltax = _titlescrollview.contentsize.width - kframewidth;
 if (deltax > maxdeltax)
 {
  // 最右边不能超范围
  deltax = maxdeltax;
 }
 [_titlescrollview setcontentoffset:cgpointmake(deltax, 0) animated:yes];
 
}

源代码下载

github:仿网易新闻tab效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/u012234115/article/details/53906323

延伸 · 阅读

精彩推荐
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17