用UIScrollview做一个网易scrollviewbar
效果如上,点击出现的图片是用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的更多相关文章
- 泥瓦匠想做一个与众不同的技术"匠"
点击蓝字,关注泥瓦匠 本文阅读大约 3 分钟.感谢阅读 喝了最后一口百事可乐,想到它的 slogan:新一代的选择.新一代的选择,每个人选择不同,人生道路历程也不同.就像我刚毕业的时候,毕业选择不一样 ...
- 强哥的分享--如何使用Spring Boot做一个邮件系统
http://springboot.fun/ actuator是单机.集群环境下要使用Spring Boot Admin将各个单机的actuator集成越来 mvn clean package -Dm ...
- 怎样做一个iOS App的启动分层引导动画?
一. 为什么要写这篇文章? 这是一个很古老的话题,从两年前新浪微博开始使用多层动画制作iOS App的启动引导页让人眼前一亮(当然,微博是不是历史第一个这个问题值得商榷)之后,各种类型的引导页层出不穷 ...
- 【技巧】使用weeman来做一个钓鱼网页
本文来自网友836834283 对玄魂工作室的投稿. 工具项目地址:https://github.com/Hypsurus/weeman/ 克隆地址:https://github.com/Hypsur ...
- 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。
最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- 做一个 App 前需要考虑的几件事
做一个 App 前需要考虑的几件事 来源:limboy的博客 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 ...
- 有了lisk,为什么我们还要做一个Asch?
0 前言 首先要声明一点,我们和我们的一些朋友都是lisk的投资人和支持者,我们也相信lisk会成功. 事实上,lisk已经成功了一半,目前在区块链领域融资金额排行第二,仅次于以太坊. 那为什么我们还 ...
- 做一个阅读管理APP
背景 由于最近在看的书有点多,所以一直想找一个能够管理阅读进度的书(鄙人记性不是很好,两天不看就忘了)可惜Android平台上一直找不到合适的APP: 有没有读书进度管理的网站或软件啊? 有没有记录读 ...
随机推荐
- 【Docker】Maven打包SpringBoot项目成Docker镜像并上传到Harbor仓库(Eclipse、STS、IDEA、Maven通用)
写在前面 最近,在研究如何使用Maven将SpringBoot项目打包成Docker镜像并发布到Harbor仓库,网上翻阅了很多博客和资料,发现大部分都是在复制粘贴别人的东西,没有经过实践的检验,根本 ...
- JMeter学习笔记--关联
1.什么是关联? 本次请求需要的数据,需要上一步的请求返回给提供的过程. 2.JMeter关联中常用的两种方式 正则表达式提取器 正则表达式提取器用于对页面任何文本的提取,提取的内容是根据正则表达式在 ...
- C++ STL的一些应用
STL一些应用 记录一些STL算法在开发中用得比较舒服的情况(不断添加...) lower_bound(begin,end,val)算法 算法说明 查找>=val的第一个元素,如果没有,返回en ...
- LeetCode刷题 链表专题
链表专题 链表题目的一般做法 单链表的结构类型 删除节点 方法一 方法二 增加节点 LeedCode实战 LC19.删除链表的倒数第N个结点 解法思路 LC24.两两交换链表中的节点 解法思路 LC6 ...
- Mysql - 整数类型的存储字节数和范围
MySQL 整数类型的存储字节数和范围 type 存储字节数 有符号最小值 无符号最小值 有符号最大值 无符号最大值 TINYINT 1 -128 0 127 255 SMALLINT 2 -3276 ...
- [源码解析] PyTorch 分布式(7) ----- DistributedDataParallel 之进程组
[源码解析] PyTorch 分布式(7) ----- DistributedDataParallel 之进程组 目录 [源码解析] PyTorch 分布式(7) ----- DistributedD ...
- python实现调用摄像头或打开视频文件
目录: (一)调用摄像头或打开视频文件代码实现 (二)说明和补充 (一)调用摄像头或打开视频文件代码实现 1 # -*- coding=GBK -*- 2 import cv2 as cv 3 4 5 ...
- nginx反向代理出错:proxy_pass
问题描述: 一台服务器代理访问另一台服务器,代码如下图所示: 重新加载nginx后不会跳到该域名,而是出现error的页面. 查看error.log日志为以下报错: 2021/03/09 23:07: ...
- PHP数组详细介绍(带示例代码)
PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合 ...
- 9.1 k8s pod版本更新流程及命令行实现升级与回滚
1.创建 Deployment root@k8-deploy:~/k8s-yaml/controllers/deployments# vim nginx-deployment.yaml apiVers ...