OC实现单选和多选按钮
本代码库暂时有OC封装,改天有空在补一个Swift封装的,主要是因为swift不是那么熟,怕出错,半天找不到问题多尴尬呀!
先附上demo下载地址CSDN:http://download.csdn.net/detail/qq_34863867/9593700
gitHub地址:https://github.com/SZLCode/RadioAndCheck
先上传两张效果图:


两者基本相似,只是部分逻辑不同而已,下边就以单选按钮为例,分析一下思路:
单选按钮主要有两部分构成,一部分是单选项的每一行和标题两大部分组成,选项又有前边的按钮和后边的文字两部分组成。
下边开始封装,先封装选项行 ,刚才分析过行由这两部分构成,先开始搭建这一部分,创建RadioButtonCell:
-(instancetype)initRadioCell:(NSString *)cellTitle selectImg:(NSString *)seletImg unselectImg:(NSString*)unselectImg cellSizeBlock:(void (^)(CGSize))callBackSize{
if (self=[super init]) {
self.selectImageName = seletImg;
self.unSelectImageName = unselectImg;
self.celltitle = cellTitle;
[self makecellView];
CGSize size = CGSizeMake(SCREEN_WIDTH, _labelView.frameHeight);
_tapView.frameHeight = size.height;
callBackSize(size);
}
return self;
}
//cell的内容
-(void)makecellView{
_tapView = [UIView new];
_tapView.frame = CGRectMake(CONTENT_MARGIN, 0, SCREEN_WIDTH-CONTENT_MARGIN*2, 35);
[self addSubview:_tapView];
//这里不使用按钮是因为想要实现点击每一个行的任何地方都能标红,而不是只能点击按钮部分
_btnView = [UIImageView new];
_btnView.frame = CGRectMake(0, 3, 24, 24);
_btnView.image = [UIImage imageNamed:self.unSelectImageName];
[_tapView addSubview:_btnView];
CGFloat cellHight =[UILabel getHeightWithTitle:self.celltitle font:16];
_labelView = [VertLabel new];
_labelView.text = self.celltitle;
_labelView.font = Font(labelFont);
_labelView.numberOfLines = 0;
[_labelView sizeToFit];
_labelView.frame = CGRectMake(_btnView.frameRight+CONTENT_MARGIN, 0, _tapView.frameRight-(_btnView.frameRight+CONTENT_MARGIN), cellHight+CONTENT_MARGIN*2);
[_tapView addSubview:_labelView];
}
界面到此搭建完成,分析得cell每被点击一次,cell选中的状态就要改变,所以就要创建一个点击方法来改变选中状态
//单击按钮行,根据选中状态判断选中还是不选中
-(void)tapRadioCell{
if (self.tapState) {
[self cancelSelectedRadioCell];
}else{
[self selectRadioCell];
}
self.tapState = !self.tapState;
}
//标识为选中状态
#pragma 可以在这里修改选中以后label不标红,默认是标红的
-(void)selectRadioCell{
_btnView.image = [UIImage imageNamed:self.selectImageName];
_labelView.textColor = [UIColor redColor];
}
//取消选中状态
-(void)cancelSelectedRadioCell{
_btnView.image = [UIImage imageNamed:self.unSelectImageName];
_labelView.textColor = [UIColor blackColor];
}
至此,cell中需要做的工作完成。
创建单选按钮类RadioButton,所有对RadioButtonCell的状态和内容的控制都来这里实现。
先根据传入cell的个数创建cell
//创建cell视图
-(void)makeRadioCell{ __block CGFloat cellInitHigh = _labelTitle.frameBottom;//设置cell高度的起始位置
for(int i=0;i<self.labelStringArr.count;i++){ __block RadioButtonCell * cell = [[RadioButtonCell alloc] initWithFrame:CGRectMake(0, cellInitHigh, SCREEN_WIDTH, 35)];
cell = [cell initRadioCell:self.labelStringArr[i] selectImg:self.selectImageName unselectImg:self.unSelectImageName cellSizeBlock:^(CGSize size) {
cellInitHigh += size.height;
cell.frameHeight = size.height;
}];
cell.tag = 60000+i;
[self addSubview:cell]; UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapCellAction:)];
tap.numberOfTapsRequired = 1;
[cell addGestureRecognizer:tap];
}
}
点击cell区域以后,根据cell原来的状态来做改变:单选有三种状态:原来没有选中的,选中点击的这一个cell;存在原来选中的cell,就要判断最新点击的cell是不是原来已经选中的cell,是就取消原来选中的;如果不是原来选中的,则取消原来选中的,选择最新的cell。
//点击cell以后
-(void)tapCellAction:(UIGestureRecognizer *)tap{
NSInteger tag = tap.view.tag; if(haveTap){//存在已经被选中的选项
RadioButtonCell * cell = [self viewWithTag:tag];
//判断选择的这一个本来是不是选中状态
if(tag==indexOld){//是原来选中的行
[cell tapRadioCell];//取消选中
haveTap = NO;
indexOld = 59999;
[self.delegate selectRadioButtonIndex:indexOld]; }else{//不是原来选中的行
RadioButtonCell *cellOld = [self viewWithTag:indexOld];
[cellOld tapRadioCell];//取消原来选中的行 [cell tapRadioCell];//选中新行
[self.delegate selectRadioButtonIndex:tag-60000];
haveTap = YES;
indexOld = tag;
}
}else{//不存在已经被选中的选项
RadioButtonCell * cell = [self viewWithTag:tag];
[cell tapRadioCell];
if (cell.tapState) {//选中某一行状态,返回选中的行
[self.delegate selectRadioButtonIndex:tag-60000];
}
indexOld =tag;//记录下选择的按钮行
haveTap = YES; } }
定义一个代理方法,用来返回用户点击的是哪一个cell
-(void)selectRadioButtonIndex:(NSInteger)index;
到此所有就搭建完成,只需要在需要创建单选按钮的地方创建、实现代理方法就好了。
-(void)awakeFromNib{
RadioButton *radioButton = [[RadioButton alloc]initWithFrame:CGRectMake(0, 60, 414, 736)];
radioButton.delegate = self;
radioButton = [radioButton initRadioButtonTitle:@"请评价好坏" selectImgName:nil unselectImgName:nil labelArr:@[@"好",@"BBBBBBBBBBBBBBBBBBBBB",@"这是第三个选项,这是第三个选项,你看我可以自动换行哟!不信吗?看我换行给你看!"]];
[self.view addSubview:radioButton];
}
#pragma radioDelegate
-(void)selectRadioButtonIndex:(NSInteger)index{
if (index==59999) {
NSLog(@"没有选项");
}else{
NSArray * arr = @[@"AAA",@"BBB",@"CCC",@"DDD",@"EEE",@"FFF",@"GGG",@"HHH",@"III"];
NSLog(@"我是%@",arr[index]);
}
}
至此,所有单选按钮的工作就做完了。
多选按钮和这个页面是一样的,只是在选中的地方逻辑略有不同。
如果点击的cell没有被选中,就选中这个cell,如果这个cell是被选中状态,就取消掉选中状态。
//点击cell以后
-(void)tapCellAction:(UIGestureRecognizer *)tap{
CheckButtonCell * cell = [self viewWithTag:tap.view.tag];
[cell tapCheckCell];
NSString *indexStr = [NSString stringWithFormat:@"%ld",tap.view.tag-70000];
if (cell.tapState) {//选中某一行状态
[self.selectIndexArr addObject:indexStr];
}else{//取消某一行的选中状态
[self.selectIndexArr removeObject:indexStr];
}
[self.delegate selectCheckButtonIndex:self.selectIndexArr]; }
再使用代理以数组形式返回最新的用户选中的列表
-(void)selectCheckButtonIndex:(NSMutableArray*)indexArr;
再在显示的地方创建就好了
-(void)awakeFromNib{
CheckButton *checkBtn = [[CheckButton alloc]initWithFrame:CGRectMake(0, 20, 414, 736)];
checkBtn.delegate = self;
checkBtn = [checkBtn initCheckButtonTitle:nil selectImgName:nil unselectImgName:nil labelArr:@[@"AAAAAAAAAAAAAAAAAAA",@"BBBBBBBBBBBBB",@"这个是多选项哦,这个是多选项哦,多选项哦,选项哦,项哦,哦!",@"DDDDDDDDDDDDDDD",@"EEEEEEEEEEEEEE",@"这个是最后一项,我可以继续增加很多选项哦,不信你可以增加GGGGGGGGGGGG来试一下哦!"]];
[self.view addSubview:checkBtn];
}
#pragma checkDelegate
-(void)selectCheckButtonIndex:(NSMutableArray *)indexArr{
if (indexArr.count) {
NSArray * arr = @[@"AAA",@"BBB",@"CCC",@"DDD",@"EEE",@"FFF",@"GGG",@"HHH",@"III"];
for (int i=0; i<indexArr.count; i++) {
NSInteger index = [indexArr[i] integerValue];
NSLog(@"我是%@选项",arr[index]);
}
}else{
NSLog(@"没有选项!");
}
}
到这里,单选和多选按钮的库就创建和使用完成了。
OC实现单选和多选按钮的更多相关文章
- js控制多层单选,多选按钮,做隐藏操作
项目中遇到多层级单选,多选按钮的置灰/隐藏操作.特意写了一个公用组件: //置灰方式 //controllerArr数组添加如下数据: //{ctrlName:"gds_anquanyuan ...
- 《手把手教你》系列技巧篇(三十三)-java+ selenium自动化测试-单选和多选按钮操作-上篇(详解教程)
1.简介 在实际自动化测试过程中,我们同样也避免不了会遇到单选和多选的测试,特别是调查问卷或者是答题系统中会经常碰到.因此宏哥在这里直接分享和介绍一下,希望小伙伴或者童鞋们在以后工作中遇到可以有所帮助 ...
- 《手把手教你》系列技巧篇(三十四)-java+ selenium自动化测试-单选和多选按钮操作-中篇(详解教程)
1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历单选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的单选按钮进行实战. 2.d ...
- 《手把手教你》系列技巧篇(三十五)-java+ selenium自动化测试-单选和多选按钮操作-下篇(详解教程)
1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历多选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的多选按钮进行实战. 2.d ...
- 《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)
1.简介 前边几篇文章是宏哥自己在本地弄了一个单选和多选的demo,然后又找了网上相关联的例子给小伙伴或童鞋们演示了一下如何自动化测试,这一篇宏哥在网上找了一个问卷调查,给小伙伴或童鞋们来演示一下.上 ...
- 『心善渊』Selenium3.0基础 — 14、Selenium对单选和多选按钮的操作
目录 1.页面中的单选按钮和多选按钮 2.判断按钮是否选中is_selected() 3.单选按钮的操作 4.多选按钮的操作 5.选择部分多选按钮的操作 1.页面中的单选按钮和多选按钮 页面中的单选按 ...
- 纯css修改单选、复选按钮样式
只支持IE9及以上 html <label><input class="radio" type="radio" name="radi ...
- Java+Selenium3方法篇24-单选和多选按钮操作
Java+Selenium3方法篇24-单选和多选按钮操作 本篇介绍 webdriver处理前端单选按钮的操作.单选按钮一般叫raido button,就像我们在电子版的单选答题过程一样,单选只能点击 ...
- cocos2dx 3.x (单选,多选,复选checkBox按钮的实现) RadioButton
// // LandLordsMakeNewRoom.hpp // MalaGame39 // // Created by work on 2016/12/19. // // #ifndef ...
随机推荐
- 错误代码: 1305 PROCEDURE world.insert_data does not exist
1.错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:call insert_data() 错误代码: 1305 PROCEDUR ...
- CentOS中配置lvm存储
磁盘添加 vmware workstation 虚拟机为例 1.关闭虚拟机,在虚拟机设置中添加3块硬盘. 2.首先创建物理卷 pvcreate /dev/sdb /dev/sdc Physical ...
- 移动端的silder,未封装,基于zepto的touch模块,有参照修改过touch的bug
<!--html模块--> <header class="appoin-head"> <ul> <li class="aa&qu ...
- [MyBatis]DAO层只写接口,不用写实现类
团队开发一个项目,由老大架了一个框架,遇到了DAO层不用写接口了,我也是用了2次才记住这个事的,因为自己一直都是习惯于写DAO层的实现类,所以,习惯性的还是写了个实现类.于是遇到错误了. 找不到那个方 ...
- Jmeter_从jdbc请求的响应中获取参数做关联
在之前的文章-参数关联中,留个一个小尾巴,这里补充一下 http://www.cnblogs.com/Zfc-Cjk/p/8295495.html 1:从sql表中将需要取的数据查出来 2:我们需要把 ...
- 【Luogu1414】又是毕业季II(数论)
[Luogu1414]又是毕业季II(数论) 题面 题目背景 "叮铃铃铃",随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘 ...
- 【NOIP2015】运输计划(二分,差分)
题面 Description 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P ...
- emacs配置
原配置 (global-set-key [f9] 'compile-file) (global-set-key [f10] 'gud-gdb) (global-set-key (kbd "C ...
- 微信小程序之换肤的功能
pc或者移动端实现换肤功能还是比较简单的,大致就是需要换肤的css,还有正常的css:把当前皮肤类型存入本地:然后通过js读取并判断当前应该加载哪套css. 由于微信小程序没有操作wxss的api,所 ...
- springboot如何测试打包部署
有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元 ...