我们经常会有多行多列按钮的页面, 这个时候我们通常会选择循环创建按钮, 然后进行按钮单选或者多选的操作!
一. 单选逻辑处理
1. 创建按钮控件数组及标签数组, 并升级当前选中按钮为属性,方便使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#define zlunselectedcolor [uicolor colorwithred:(241)/255.0 green:(242)/255.0 blue:(243)/255.0 alpha:1.0] #define zlselectedcolor [uicolor colorwithred:(108)/255.0 green:(187)/255.0 blue:(82)/255.0 alpha:1.0] @interface zlradioviewcontroller () // 标签数组(按钮文字) @property (nonatomic, strong) nsarray *markarray; // 按钮数组 @property (nonatomic, strong) nsmutablearray *btnarray; // 选中按钮 @property (nonatomic, strong) uibutton *selectedbtn; @end |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#pragma mark - 懒加载 - (nsarray *)markarray { if (!_markarray) { nsarray *array = [nsarray array]; array = @[@ "14" , @ "15" , @ "16" , @ "17" , @ "18" ]; _markarray = array; } return _markarray; } - (nsmutablearray *)btnarray { if (!_btnarray) { nsmutablearray *array = [nsmutablearray array]; _btnarray = array; } return _btnarray; } |
2. 创建单选视图, 循环创建按钮, 并回显上次选中值
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
|
- ( void )setupradiobtnview { cgfloat ui_view_width = [uiscreen mainscreen].bounds.size.width; cgfloat marginx = 15; cgfloat top = 100; cgfloat btnh = 30; cgfloat width = (250 - marginx * 4) / 3; // 按钮背景 uiview *btnsbgview = [[uiview alloc] initwithframe:cgrectmake((ui_view_width - 250) * 0.5, 50, 250, 300)]; btnsbgview.backgroundcolor = [uicolor whitecolor]; [self.view addsubview:btnsbgview]; // 循环创建按钮 nsinteger maxcol = 3; for (nsinteger i = 0; i < 5; i++) { uibutton *btn = [uibutton buttonwithtype:uibuttontypecustom]; btn.backgroundcolor = zlunselectedcolor; btn.layer.cornerradius = 3.0; // 按钮的边框弧度 btn.clipstobounds = yes; btn.titlelabel.font = [uifont boldsystemfontofsize:12]; [btn settitlecolor:[uicolor colorwithred:(102)/255.0 green:(102)/255.0 blue:(102)/255.0 alpha:1.0] forstate:uicontrolstatenormal]; [btn settitlecolor:[uicolor whitecolor] forstate:uicontrolstateselected]; [btn addtarget:self action:@selector(choosemark:) forcontrolevents:uicontroleventtouchupinside]; nsinteger col = i % maxcol; //列 btn.x = marginx + col * (width + marginx); nsinteger row = i / maxcol; //行 btn.y = top + row * (btnh + marginx); btn.width = width; btn.height = btnh; [btn settitle:self.markarray[i] forstate:uicontrolstatenormal]; [btnsbgview addsubview:btn]; btn.tag = i; [self.btnarray addobject:btn]; } // 创建完btn后再判断是否能选择(之前是已经选取过的) // 假数据:之前已经上传16时,则回显16 for (uibutton *btn in btnsbgview.subviews) { if ([@ "16" isequaltostring:btn.titlelabel.text]) { btn.selected = yes; btn.backgroundcolor = zlselectedcolor; break ; } } } |
3. 数字按钮单选处理, 根据tag值去判断是否是当前选中按钮
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
- ( void )choosemark:(uibutton *)sender { nslog(@ "点击了%@" , sender.titlelabel.text); self.selectedbtn = sender; sender.selected = !sender.selected; for (nsinteger j = 0; j < [self.btnarray count]; j++) { uibutton *btn = self.btnarray[j] ; if (sender.tag == j) { btn.selected = sender.selected; } else { btn.selected = no; } btn.backgroundcolor = zlunselectedcolor; } uibutton *btn = self.btnarray[sender.tag]; if (btn.selected) { btn.backgroundcolor = zlselectedcolor; } else { btn.backgroundcolor = zlunselectedcolor; } } |
二. 多选逻辑处理
1. 创建按钮控件数组和标签字典, 及选中标签数组(数字)和选中标签数组(文字字符串), 为了展示及上传按钮数据使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#define zlunselectedcolor [uicolor colorwithred:(241)/255.0 green:(242)/255.0 blue:(243)/255.0 alpha:1.0] #define zlselectedcolor [uicolor colorwithred:(128)/255.0 green:(177)/255.0 blue:(34)/255.0 alpha:1.0] @interface zlmultiselectcontroller () // 标签数组 @property (nonatomic, strong) nsarray *markarray; // 标签字典 @property (nonatomic, strong) nsdictionary *markdict; // 选中标签数组(数字) @property (nonatomic, strong) nsmutablearray *selectedmarkarray; // 选中标签数组(文字字符串) @property (nonatomic, strong) nsmutablearray *selectedmarkstrarray; @end |
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
|
#pragma mark - 懒加载 - (nsarray *)markarray { if (!_markarray) { nsarray *array = [nsarray array]; array = @[@ "导购" , @ "客服" , @ "家教" , @ "礼仪" , @ "主持" ]; _markarray = array; } return _markarray; } // 上传通过文字key取数字value发送数字 - (nsdictionary *)markdict { if (!_markdict) { nsdictionary *dict = [nsdictionary dictionary]; dict = @{ @ "导购" : @ "3" , @ "客服" : @ "7" , @ "家教" : @ "9" , @ "礼仪" : @ "10" , @ "主持" : @ "11" , }; _markdict = dict; } return _markdict; } - (nsmutablearray *)selectedmarkarray { if (!_selectedmarkarray) { _selectedmarkarray = [nsmutablearray array]; } return _selectedmarkarray; } - (nsmutablearray *)selectedmarkstrarray { if (!_selectedmarkstrarray) { _selectedmarkstrarray = [nsmutablearray array]; } return _selectedmarkstrarray; } |
2.循环创建按钮视图, 循环创建按钮
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
|
- ( void )setupmultiselectview { cgfloat ui_view_width = [uiscreen mainscreen].bounds.size.width; cgfloat marginx = 15; cgfloat top = 19; cgfloat btnh = 35; cgfloat marginh = 40; cgfloat height = 130; cgfloat width = (ui_view_width - marginx * 4) / 3; // 按钮背景 uiview *btnsbgview = [[uiview alloc] initwithframe:cgrectmake(0, 100, ui_view_width, height)]; btnsbgview.backgroundcolor = [uicolor whitecolor]; [self.view addsubview:btnsbgview]; // 循环创建按钮 nsinteger maxcol = 3; for (nsinteger i = 0; i < 5; i++) { uibutton *btn = [uibutton buttonwithtype:uibuttontypecustom]; btn.backgroundcolor = zlunselectedcolor; btn.layer.cornerradius = 3.0; // 按钮的边框弧度 btn.clipstobounds = yes; btn.titlelabel.font = [uifont boldsystemfontofsize:14]; [btn settitlecolor:[uicolor colorwithred:(102)/255.0 green:(102)/255.0 blue:(102)/255.0 alpha:1.0] forstate:uicontrolstatenormal]; [btn settitlecolor:[uicolor whitecolor] forstate:uicontrolstateselected]; [btn addtarget:self action:@selector(choosemark:) forcontrolevents:uicontroleventtouchupinside]; nsinteger col = i % maxcol; //列 btn.x = marginx + col * (width + marginx); nsinteger row = i / maxcol; //行 btn.y = top + row * (btnh + marginx); btn.width = width; btn.height = btnh; [btn settitle:self.markarray[i] forstate:uicontrolstatenormal]; [btnsbgview addsubview:btn]; } // 确定按钮 uibutton *surebtn = [uibutton buttonwithtype:uibuttontypecustom]; [surebtn settitle:@ "确定" forstate:uicontrolstatenormal]; surebtn.frame = cgrectmake(marginx * 2, cgrectgetmaxy(btnsbgview.frame) + marginh, ui_view_width - marginx * 4, 40); surebtn.titlelabel.font = [uifont boldsystemfontofsize:16]; [surebtn addtarget:self action:@selector(surebtnclick) forcontrolevents:uicontroleventtouchupinside]; surebtn.backgroundcolor = [uicolor orangecolor]; surebtn.layer.cornerradius = 3.0; surebtn.clipstobounds = yes; [self.view addsubview:surebtn]; } |
3. 按钮多选逻辑处理, 并上传数据请求处理
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
|
/** * 按钮多选处理 */ - ( void )choosemark:(uibutton *)btn { btn.selected = !btn.selected; if (btn.isselected) { btn.backgroundcolor = zlselectedcolor; [self.selectedmarkarray addobject:self.markdict[btn.titlelabel.text]]; [self.selectedmarkstrarray addobject:btn.titlelabel.text]; } else { btn.backgroundcolor = zlunselectedcolor; [self.selectedmarkarray removeobject:self.markdict[btn.titlelabel.text]]; [self.selectedmarkstrarray removeobject:btn.titlelabel.text]; } } /** * 确认接口请求处理 */ - ( void )surebtnclick { // 用户选择标签后就把值上传, 也要传给服务器下次直接请求回来 // 按钮数字标识字符串 nsstring *numstr = [self.selectedmarkarray componentsjoinedbystring:@ "," ]; // 按钮文字字符串 nsstring *str = [self.selectedmarkstrarray componentsjoinedbystring:@ "," ]; // 测试:拼接请求参数 nslog(@ "按钮数字标识字符串:%@" , numstr); nslog(@ "按钮文字字符串:%@" , str); } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.jianshu.com/p/ba9b53af81c8