效果如上,点击出现的图片是用UIImageview添加上的,比较简陋

我用了两种方法,第一种是直接在viewcontroller里面写代码

第二种是用了一个类来封装这个scrollviewbar 对外开放接口方法

下面就把我比较满意的第二种方法放上来

----------------------------------------假装分割线----------------

我首先新建了一个类 类名如下

对外可以使用该类的类方法,直接得到一个ScrollViewBar类型的对象

在使用一个对象方法来设置scrollviewbar上要表示的标题

 1 #import <UIKit/UIKit.h>
2
3 @interface ScrollViewBar : UIScrollView
4
5 @property (nonatomic , strong)NSArray *nameArr;
6
7 //-(void)setNameArr:(NSArray *)nameArr;
8
9
10 +(ScrollViewBar *)showScrollviewWithFrame :(CGRect)frame andContainerView :(UIView *)father andNameCount:(NSInteger)count;
11
12 -(void)addBtnsNameArr;
13 @end

以下是类方法的实现

 1 +(ScrollViewBar *)showScrollviewWithFrame :(CGRect)frame andContainerView :(UIView *)father andNameCount:(NSInteger)count{
2 ScrollViewBar *scrViewBar = [[ScrollViewBar alloc]initWithFrame:frame];
3 [scrViewBar setBackgroundColor:[UIColor whiteColor]];
4 scrViewBar.contentSize = CGSizeMake(20+90*count, frame.size.height);
5 scrViewBar.showsHorizontalScrollIndicator = false;
6 scrViewBar.bounces = NO;
7 [father addSubview:scrViewBar];
8
9
10 return scrViewBar;
11 }

对象方法的实现

 1 -(void)addBtnsNameArr{
2
3 self.btnArr = [NSMutableArray array];
4 for (int i = 0; i < self.nameArr.count; i++) {
5 UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
6 [self addSubview:btn];
7 //设置frame
8 btn.frame = CGRectMake(10+90*i, 5, 80, 50);
9 //加tag值
10 btn.tag = i + 1;
11 //设置标题 字体大小 颜色 事件
12 [btn setTitle:[self.nameArr objectAtIndex:i] forState:UIControlStateNormal];
13 [self setBtnEnabled:btn andValue:YES];
14 [btn addTarget:self action:@selector(btnDidClicked:) forControlEvents:UIControlEventTouchUpInside];
15
16 //把btn放进数组里面去
17 [_btnArr addObject:btn];
18 }
19 UIButton * firBtn = [_btnArr objectAtIndex:0];
20 [self setBtnEnabled:firBtn andValue:NO];
21 //添加视图
22 [self initUIImageView];
23 }

给scrollviewbar上的uibutton 加点击方法

 1 -(void)btnDidClicked:(UIButton *)btn{
2 if (btn.isEnabled == NO) {//说明已经被点击了,那么就不能再点击,
3
4 }else{//还没被点 点击就会变换字的大小
5 //先把已经点击过的字体变回来
6
7 for (UIButton *clickedBtn in _btnArr) {
8 if (clickedBtn.isEnabled == NO) {
9 [self setBtnEnabled:clickedBtn andValue:YES];
10 }
11 }
12 [self setBtnEnabled:btn andValue:NO];
13
14 //改变位置
15 if (btn.tag > 2 && btn.tag < self.nameArr.count - 1) {//从第三个开始滑动 到倒数第二个
16 [self setContentOffset:CGPointMake(btn.frame.origin.x+40-self.frame.size.width/2, 0) animated:YES];
17 }else{
18 if (btn.tag < 3) {
19 [self setContentOffset:CGPointMake(0, 0) animated:YES];
20 }else{
21 [self setContentOffset:CGPointMake(640-self.frame.size.width, 0) animated:YES];
22
23 }
24 }
25 //imgview的hidden值为yes
26
27 //把其他视图的hidden值设为yes
28
29 for (UIImageView *imgv in _imgViewArr) {
30 imgv.hidden = YES;
31 }
32 UIImageView *imgview = [_imgViewArr objectAtIndex:btn.tag-1];
33 imgview.hidden = NO;
34
35
36 }
37 }

下面这个方法是用来加载点击button显示的图片imageview ,只是做一个大概的样子。

(这里可以改进,我使用了imageview的hidden属性,按道理是应该用懒加载,不过我还不怎么会,等我会了以后再写一下用懒加载的方法)

 1 //添加视图
2 -(void)initUIImageView{
3 self.imgViewArr = [NSMutableArray array];
4 self.imgArr = [NSArray arrayWithObjects:@"777",@"111", @"222",@"333",@"444",@"555",@"666",nil];
5 for (int i = 0; i < self.nameArr.count; i++) {
6 UIImageView *imgView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:[_imgArr objectAtIndex:i]]];
7 imgView.frame = CGRectMake(0, self.frame.origin.y +self.frame.size.height+5, self.frame.size.width, self.superview.frame.size.height - self.frame.origin.y - self.frame.size.height);
8 imgView.hidden = YES;
9 [self.superview addSubview:imgView];
10 [_imgViewArr addObject:imgView];
11 }
12 UIImageView *firImgview = [_imgViewArr objectAtIndex:0];
13 firImgview.hidden = NO;
14
15 }

最后是重写enabled的set方法

 1 //重写enabled的set方法
2 -(void)setBtnEnabled :(UIButton *)btn andValue :(BOOL)enabledV{
3 if (enabledV == YES) {//要把btn的enabled的值设置为yes 就是让btn的格式变成蓝色的
4 btn.titleLabel.font = [UIFont systemFontOfSize:18];
5 [btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal] ;
6 btn.enabled = YES;
7 }else{
8 btn.titleLabel.font = [UIFont systemFontOfSize:24];
9 [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal] ;
10 btn.enabled = NO;
11 }
12 }

(在这个程序中,我是通过设置uibutton的enabled属性来判断button是否被点击过了,也可以用selected属性 那样就是重写selected的set方法)

全部实现代码如下:

#import "ScrollViewBar.h"
@interface ScrollViewBar ()
@property (nonatomic , strong)NSMutableArray *btnArr;
@property (nonatomic , strong)NSArray *imgArr;
@property (nonatomic , strong)NSMutableArray *imgViewArr;
@end
@implementation ScrollViewBar
+(ScrollViewBar *)showScrollviewWithFrame :(CGRect)frame andContainerView :(UIView *)father andNameCount:(NSInteger)count{
ScrollViewBar *scrViewBar = [[ScrollViewBar alloc]initWithFrame:frame];
[scrViewBar setBackgroundColor:[UIColor whiteColor]];
scrViewBar.contentSize = CGSizeMake(20+90*count, frame.size.height);
scrViewBar.showsHorizontalScrollIndicator = false;
scrViewBar.bounces = NO;
[father addSubview:scrViewBar]; return scrViewBar;
} -(void)addBtnsNameArr{ self.btnArr = [NSMutableArray array];
for (int i = 0; i < self.nameArr.count; i++) {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[self addSubview:btn];
//设置frame
btn.frame = CGRectMake(10+90*i, 5, 80, 50);
//加tag值
btn.tag = i + 1;
//设置标题 字体大小 颜色 事件
[btn setTitle:[self.nameArr objectAtIndex:i] forState:UIControlStateNormal];
[self setBtnEnabled:btn andValue:YES];
[btn addTarget:self action:@selector(btnDidClicked:) forControlEvents:UIControlEventTouchUpInside]; //把btn放进数组里面去
[_btnArr addObject:btn];
}
UIButton * firBtn = [_btnArr objectAtIndex:0];
[self setBtnEnabled:firBtn andValue:NO];
//添加视图
[self initUIImageView];
} //添加视图
-(void)initUIImageView{
self.imgViewArr = [NSMutableArray array];
self.imgArr = [NSArray arrayWithObjects:@"777",@"111", @"222",@"333",@"444",@"555",@"666",nil];
for (int i = 0; i < self.nameArr.count; i++) {
UIImageView *imgView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:[_imgArr objectAtIndex:i]]];
imgView.frame = CGRectMake(0, self.frame.origin.y +self.frame.size.height+5, self.frame.size.width, self.superview.frame.size.height - self.frame.origin.y - self.frame.size.height);
imgView.hidden = YES;
[self.superview addSubview:imgView];
[_imgViewArr addObject:imgView];
}
UIImageView *firImgview = [_imgViewArr objectAtIndex:0];
firImgview.hidden = NO; } -(void)btnDidClicked:(UIButton *)btn{
if (btn.isEnabled == NO) {//说明已经被点击了,那么就不能再点击, }else{//还没被点 点击就会变换字的大小
//先把已经点击过的字体变回来 for (UIButton *clickedBtn in _btnArr) {
if (clickedBtn.isEnabled == NO) {
[self setBtnEnabled:clickedBtn andValue:YES];
}
}
[self setBtnEnabled:btn andValue:NO]; //改变位置
if (btn.tag > 2 && btn.tag < self.nameArr.count - 1) {//从第三个开始滑动 到倒数第二个
[self setContentOffset:CGPointMake(btn.frame.origin.x+40-self.frame.size.width/2, 0) animated:YES];
}else{
if (btn.tag < 3) {
[self setContentOffset:CGPointMake(0, 0) animated:YES];
}else{
[self setContentOffset:CGPointMake(640-self.frame.size.width, 0) animated:YES]; }
}
//imgview的hidden值为yes //把其他视图的hidden值设为yes for (UIImageView *imgv in _imgViewArr) {
imgv.hidden = YES;
}
UIImageView *imgview = [_imgViewArr objectAtIndex:btn.tag-1];
imgview.hidden = NO; }
} //重写enabled的set方法
-(void)setBtnEnabled :(UIButton *)btn andValue :(BOOL)enabledV{
if (enabledV == YES) {//要把btn的enabled的值设置为yes 就是让btn的格式变成蓝色的
btn.titleLabel.font = [UIFont systemFontOfSize:18];
[btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal] ;
btn.enabled = YES;
}else{
btn.titleLabel.font = [UIFont systemFontOfSize:24];
[btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal] ;
btn.enabled = NO;
}
} @end

在viewcontroller里面的配置

 1 #import "ViewController.h"
2 #import "ScrollViewBar.h"
3 @interface ViewController ()
4
5 @property(nonatomic ,strong)ScrollViewBar *scrViewBar;
6
7 @end
8
9 @implementation ViewController
10
11 - (void)viewDidLoad {
12 [super viewDidLoad];
13
14
15
16 self.scrViewBar = [ScrollViewBar showScrollviewWithFrame:CGRectMake(0, 100, self.view.frame.size.width, 60) andContainerView:self.view andNameCount:7];
17 [self.view setBackgroundColor:[UIColor grayColor]];
18
19 NSArray * nameArray = [[NSArray alloc]initWithObjects:@"全部",@"视频",@"声音",@"图片",@"段子",@"军事",@"科技", nil];
20 _scrViewBar.nameArr = nameArray;
21 [_scrViewBar addBtnsNameArr];
22
23 }
24
25 @end

在写这个程序过程中产生的疑惑:

1.一开始是想只写一个类方法,不过后来发现要在这一个类方法里面使用对象方法,就是不行的,所以又添加了一个对外的对象方法。

2.数组一定要初始化

用UIScrollview做一个网易scrollviewbar的更多相关文章

  1. 泥瓦匠想做一个与众不同的技术"匠"

    点击蓝字,关注泥瓦匠 本文阅读大约 3 分钟.感谢阅读 喝了最后一口百事可乐,想到它的 slogan:新一代的选择.新一代的选择,每个人选择不同,人生道路历程也不同.就像我刚毕业的时候,毕业选择不一样 ...

  2. 强哥的分享--如何使用Spring Boot做一个邮件系统

    http://springboot.fun/ actuator是单机.集群环境下要使用Spring Boot Admin将各个单机的actuator集成越来 mvn clean package -Dm ...

  3. 怎样做一个iOS App的启动分层引导动画?

    一. 为什么要写这篇文章? 这是一个很古老的话题,从两年前新浪微博开始使用多层动画制作iOS App的启动引导页让人眼前一亮(当然,微博是不是历史第一个这个问题值得商榷)之后,各种类型的引导页层出不穷 ...

  4. 【技巧】使用weeman来做一个钓鱼网页

    本文来自网友836834283 对玄魂工作室的投稿. 工具项目地址:https://github.com/Hypsurus/weeman/ 克隆地址:https://github.com/Hypsur ...

  5. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  6. 基于trie树做一个ac自动机

    基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...

  7. 做一个 App 前需要考虑的几件事

    做一个 App 前需要考虑的几件事  来源:limboy的博客   随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 ...

  8. 有了lisk,为什么我们还要做一个Asch?

    0 前言 首先要声明一点,我们和我们的一些朋友都是lisk的投资人和支持者,我们也相信lisk会成功. 事实上,lisk已经成功了一半,目前在区块链领域融资金额排行第二,仅次于以太坊. 那为什么我们还 ...

  9. 做一个阅读管理APP

    背景 由于最近在看的书有点多,所以一直想找一个能够管理阅读进度的书(鄙人记性不是很好,两天不看就忘了)可惜Android平台上一直找不到合适的APP: 有没有读书进度管理的网站或软件啊? 有没有记录读 ...

随机推荐

  1. CANN5.0黑科技解密 | 别眨眼!缩小隧道,让你的AI模型“身轻如燕”!

    摘要:CANN作为释放昇腾硬件算力的关键平台,通过深耕先进的模型压缩技术,聚力打造AMCT模型压缩工具,在保证模型精度前提下,不遗余力地降低模型的存储空间和计算量. 随着深度学习的发展,推理模型巨大的 ...

  2. tcp 三次握手建立连接难点总结

    所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包. 三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号 ...

  3. Canvas 放烟花合集 -- 用粉丝头像做成烟花绽放🧨

    "我对着烟花许愿,希望你永远在我身边" "凑不够满天星辰那就去看看烟花吧,人间烟火气,最抚凡人心" 小tips:喜欢的可以关注博主私信代码噢~ 也可以看看前面两 ...

  4. sed tr 批量转换邮箱格式 去除"\n" 行尾添加";"

    1:从phpmyadmin上拿下来的数据是这样的: 2:od -c 发现存在\r\n (windows上编码问题) $ od -c sql.csv 先将\r处理掉 $ sed 's/\r//' sql ...

  5. 谷粒 | 18 | Hystrix熔断器

    Spring Cloud调用接口过程 Spring Cloud 在接口调用上,大致会经过如下几个组件配合: Feign ----->Hystrix ->Ribbon ->Http C ...

  6. wm_concat结果长度限制的有关问题 ORA-06502: PL/SQL: 数字或值错误

    该函数作用是把列值合并(用英文逗号分割),但是数量有限制,返回的字符数上线是4000(oracle11g),超过会报错,听说oracle版本到 11.2.0.2.0 或以上返回的是clob类型,长度就 ...

  7. Java 关键字之 final

    欢迎学习 Java 基础文章系列之 final 关键字 final 代表什么意思? final 通常是指无法被改变或者不能被改变的,什么情况下不想被改变呢? 不想改变可能有两种原因:设计或者效率. 在 ...

  8. scrapy_电影天堂多页数据和图片下载

    嵌套的 爬取 先获取第一页的标题 点击标题到第二页的图片url 1.创建项目 > scrapy startproject scrapy_movie_099 2.创建爬虫文件 spiders> ...

  9. 分享一下Eclipse中节省时间的技巧吧

    [初级技巧] ★★ 鼠标放在一个类名上面,会显示Javadoc.也可以通过屏幕下方的Javadoc面板来查看(你可以把它看成是MSDN的Java版). ★ 每个函数的第一行,左边有个圆圈,单击这个圆圈 ...

  10. [spojQTREE5]Query on a tree V

    合理的正解大概是动态点分治,这里给出其实现 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 st ...