`
zhy584520
  • 浏览: 183938 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

自定义控件复选框和单选框的实现

    博客分类:
  • IOS
 
阅读更多

我们先实现单个按钮,为了复用,不管单选还是复选按钮都是使用同一个类来实现,为了区别单选还是复选,我们用一个自定义枚举类型CheckButtonStyle属性style来区别,当其值设置为CheckButtonStyleDefault或CheckButtonStyleBox时,为复选按钮:

当其值设为CheckButtonStyleRadio时,为单选按钮:

当按钮在选中/反选状态间切换时,文字左边的图片自动转换。

整个控件是由一个ImageView、一个Label、一个BOOL变量及其他变量组成,.h文件如下:

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
typedef enum {
    CheckButtonStyleDefault = 0 ,
    CheckButtonStyleBox = 1 ,
    CheckButtonStyleRadio = 2
} CheckButtonStyle;
#import <Foundation/Foundation.h>
 
@interface CheckButton : UIControl {
//UIControl* control;
UILabel * label ;
UIImageView * icon ;
BOOL checked ;
id value , delegate ;
CheckButtonStyle style ;
NSString * checkname ,* uncheckname ; // 勾选/反选时的图片文件名
}
@property ( retain , nonatomic ) id value,delegate;
@property ( retain , nonatomic )UILabel* label;
@property ( retain , nonatomic )UIImageView* icon;
@property ( assign )CheckButtonStyle style;
-( CheckButtonStyle )style;
-( void )setStyle:( CheckButtonStyle )st;
-( BOOL )isChecked;
-( void )setChecked:( BOOL )b;
@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
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
#import "CheckButton.h"
 
 
@implementation CheckButton
@synthesize label,icon,value,delegate;
-( id )initWithFrame:( CGRect ) frame
{
if ( self =[ super initWithFrame : frame ]) {
icon =[[ UIImageView alloc ] initWithFrame :
  CGRectMake ( 10 , 0 , frame . size . height , frame . size . height )];
[ self setStyle : CheckButtonStyleDefault ]; // 默认风格为方框(多选)样式
//self.backgroundColor=[UIColor grayColor];
[ self addSubview : icon ];
label =[[ UILabel alloc ] initWithFrame : CGRectMake ( icon . frame . size . width + 24 , 0 ,
   frame . size . width - icon . frame . size . width - 24 ,
   frame . size . height )];
label . backgroundColor =[ UIColor clearColor ];
label . font =[ UIFont fontWithName : @"Arial" size : 20 ];
label . textColor =[ UIColor
  colorWithRed : 0xf9 / 255.0
  green : 0xd8 / 255.0
  blue : 0x67 / 255.0
  alpha : 1 ];
label . textAlignment = UITextAlignmentLeft ;
[ self addSubview : label ];
[ self addTarget : self action : @selector ( clicked ) forControlEvents : UIControlEventTouchUpInside ];
}
return self ;
}
-( CheckButtonStyle )style{
return style ;
}
-( void )setStyle:( CheckButtonStyle )st{
style =st;
switch ( style ) {
case CheckButtonStyleDefault :
case CheckButtonStyleBox :
checkname = @"checked.png" ;
uncheckname = @"unchecked.png" ;
break ;
case CheckButtonStyleRadio :
checkname = @"radio.png" ;
uncheckname = @"unradio.png" ;
break ;
default :
break ;
}
[ self setChecked : checked ];
}
-( BOOL )isChecked{
return checked ;
}
-( void )setChecked:( BOOL )b{
if (b!= checked ){
checked =b;
}
if ( checked ) {
[ icon setImage :[ UIImage imageNamed : checkname ]];
} else {
[ icon setImage :[ UIImage imageNamed : uncheckname ]];
}
}
-( void )clicked{
[ self setChecked :! checked ];
if ( delegate != nil ) {
SEL sel= NSSelectorFromString ( @"checkButtonClicked" );
if ([ delegate respondsToSelector :sel]){
[ delegate performSelector :sel];
} 
}
}
-( void )dealloc{
value = nil ; delegate = nil ;
[ label release ];
[ icon release ];
[ super dealloc ];
}
@end

使用CheckButton类很简单,构造、设置标签文本等属性,然后addSubview:

1
2
3
4
5
CheckButton * cb=[[ CheckButton a lloc ] initWithFrame : CGRectMake ( 20 , 60 , 260 , 32 )];
cb. label . text = @"checkbutton1" ;
cb. value =[[ NSNumber alloc ] initWithInt : 18 ];
cb. style = CheckButtonStyleDefault ;
[ self . view addSubview :cb];

二、单选按钮组的实现

复选按钮无所谓“组”的概念,单选按钮则不同。在同一个组中,单选按钮只允许同时选择一个按钮,不能选多个,因此我们要实现一个单选按钮组的类:

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
#import <Foundation/Foundation.h>
#import "CheckButton.h"
 
@interface RadioGroup : NSObject {
NSMutableArray * children ;
NSString * text ;
id value ;
}
@property ( readonly )NSString* text;
@property ( readonly ) id value;
-( void )add:( CheckButton *)cb;
-( void )checkButtonClicked:( id )sender;
@end
#import "RadioGroup.h"
 
 
@implementation RadioGroup
@synthesize text,value;
-( id )init{
if ( self =[ super init ]){
children =[[ NSMutableArray alloc ] init ];
}
return self ;
}
-( void )add:( CheckButton *)cb{
cb. delegate = self ;
if (cb. checked ) {
text =cb. label . text ;
value =cb. value ;
}
[ children addObject :cb];
}
-( void )checkButtonClicked:( id )sender{
CheckButton * cb=( CheckButton *)sender;
if (!cb. checked ) {
// 实现单选
for ( CheckButton * each in children ){
if (each. checked ) {
[each setChecked : NO ];
}
}
[cb setChecked : YES ];
// 复制选择的项
text =cb. label . text ;
value =cb. value ;
}
NSLog ( @"text:%@,value:%d" , text ,[( NSNumber *) value intValue ]);
}
-( void )dealloc{
[ text release ];
value = nil ;
[ children release ];
[ super dealloc ];
}
@end

单选按钮组在ViewController中的使用:

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
-( id )initWithNibName:( NSString *)nibNameOrNil bundle:( NSBundle *)nibBundleOrNil{
if ( self =[ super initWithNibName :nibNameOrNil bundle :nibBundleOrNil]){
// 单选按钮组
rg =[[ RadioGroup alloc ] init ];
// 第 1 个单选按钮
CheckButton * cb=[[ CheckButton alloc ] initWithFrame : CGRectMake ( 20 , 60 , 260 , 32 )];
// 把单选按钮加入按钮组
[ rg add :cb];
cb. label . text = @"★" ;
cb. value =[[ NSNumber alloc ] initWithInt : 1 ];
// 把按钮设置为单选按钮样式
cb. style = CheckButtonStyleRadio ;
// 加入视图
[ self . view addSubview :cb];
[cb release ]; //add 后,会自动持有,可以释放
// 第 2 个单选按钮
cb=[[ CheckButton alloc ] initWithFrame : CGRectMake ( 20 , 100 , 260 , 32 )];
[ rg add :cb];
cb. label . text = @"★★" ;
cb. value =[[ NSNumber alloc ] initWithInt : 2 ];
cb. style = CheckButtonStyleRadio ;
[ self . view addSubview :cb];
[cb release ];
// 第 3 个单选按钮
cb=[[ CheckButton alloc ] initWithFrame : CGRectMake ( 20 , 140 , 260 , 32 )];
// 各种属性必须在 [rg addv] 之前设置,否则 text 和 value 不会被 populate
cb. checked = YES ;
cb. label . text = @"★★★" ;
cb. value =[[ NSNumber alloc ] initWithInt : 3 ];
cb. style = CheckButtonStyleRadio ;
[ self . view addSubview :cb];
[ rg add :cb]; // 属性设置完之后再 add
[cb release ];
// 第 4 个单选按钮
cb=[[ CheckButton alloc ] initWithFrame : CGRectMake ( 20 , 180 , 260 , 32 )];
[ rg add :cb];
cb. label . text = @"★★★★" ;
cb. value =[[ NSNumber alloc ] initWithInt : 4 ];
cb. style = CheckButtonStyleRadio ;
[ self . view addSubview :cb];
[cb release ];
// 第 5 个单选按钮
cb=[[ CheckButton alloc ] initWithFrame : CGRectMake ( 20 , 220 , 260 , 32 )];
[ rg add :cb];
cb. label . text = @"★★★★★" ;
cb. value =[[ NSNumber alloc ] initWithInt : 5 ];
cb. style = CheckButtonStyleRadio ;
[ self . view addSubview :cb];
[cb release ];
}
return self ;
}

运行效果:

原文作者:颐和园

原文链接:http://blog.csdn.net/kmyhy/archive/2011/01/18/6149996.aspx

分享到:
评论

相关推荐

    VS2019MFC 控件自绘大全(按钮/复选框/单选框/菜单栏/静态文本/等控件自绘继承类)

    本教程重点讲解的是如何在MFC中实现控件的自绘,特别是针对按钮、复选框、单选框、菜单栏、静态文本等常见控件的自定义绘制。 1. **控件自绘基础** 自绘是指程序员通过重写控件的OnDraw()方法,亲自控制控件的绘制...

    重绘复选框和单选框

    首先,我们需要理解复选框(Checkbox)和单选框(Radio Button)的基本工作原理。复选框允许用户选择多个选项,而单选框则确保在同一组内只能有一个选项被选中。在大多数编程语言中,如C++,它们通常作为控件类存在...

    delphi Listview复选框checkbox实现单选的功能

    总之,实现Delphi ListView的复选框单选功能需要自定义事件处理,以确保每次点击或操作后只有一个项被选中。提供的源码和实例将帮助开发者更好地理解和应用这一功能,从而提高应用程序的用户交互性。

    C#自定义控件(usercontrol)--美化单选按钮和复选按钮(测试可用)

    2. **设计界面**:在设计器中,我们可以从工具箱拖放其他控件,如单选按钮(RadioButton)和复选框(CheckBox),并布局它们以形成所需的设计。 3. **代码实现**:在UserControl的代码-behind文件中,我们可以编写处理...

    C#自定义控件(usercontrol)--美化单选按钮和复选按钮

    本主题将深入探讨如何利用UserControl来实现对标准Windows Forms控件,如单选按钮(RadioButton)和复选框(CheckBox)的美化。UserControl是Windows Forms提供的一种复合控件,它允许开发人员将多个基本控件组合...

    复选框和单选按钮动画效果.zip

    在前端开发中,复选框(Checkbox)和单选按钮(Radio Button)是常见的用户界面元素,用于收集用户的多选或单选数据。本压缩包“复选框和单选按钮动画效果.zip”可能包含了一些关于如何为这些元素添加动态视觉效果的...

    原生的复选框(checkbox button)和单选按钮(radio button)实现透明背景效果解决方案

    在Windows编程中,原生的复选框(Checkbox)和单选按钮(Radio Button)通常是由Windows API或者特定的库如ATL/WTL提供的控件。这些控件默认的外观和行为是系统定义的,包括它们的背景颜色,通常与对话框或窗口的...

    C#自定义控件(usercontrol)--美化单选按钮和复选按钮__0525.rar

    本资源“C#自定义控件(usercontrol)--美化单选按钮和复选按钮__0525.rar”显然是一个关于如何在C#中创建自定义UserControl来美化标准的单选按钮(RadioButton)和复选按钮(CheckBox)的教程或代码示例。...

    jQuery实现自定义黑色单选框和复选框代码.zip

    本压缩包"jQuery实现自定义黑色单选框和复选框代码.zip"包含了一份使用jQuery来定制样式,特别是创建黑色主题的单选框(radio)和复选框(checkbox)的示例代码。 首先,我们需要理解jQuery的基本用法。jQuery通过$...

    VC++ 复选框控件视频

    本视频教程将深入讲解如何在VC++中创建和操作复选框控件,包括: 1. 创建复选框控件:演示如何在资源编辑器中添加复选框并设置其属性。 2. 编写事件处理代码:解释如何编写响应BN_CLICKED事件的代码,以及如何读取和...

    ios 自定义复选按钮和单选按钮

    总之,通过自定义复选和单选按钮,开发者不仅可以定制界面样式,还能实现特定的交互逻辑,从而提供更加符合应用需求的用户体验。在实现过程中,会涉及iOS UI设计原则、视图绘制、事件响应、动画效果以及代码封装和...

    单选框和复选框_C#_

    总的来说,单选框和复选框是C#编程中不可或缺的UI元素,它们能有效地帮助用户进行选择,同时也方便开发者获取用户的输入。熟练掌握这两者的使用,将对提升软件的用户体验和功能完整性起到关键作用。在实际项目中,...

    Qt 源代码 - 07_单选框、复选框及实例

    在Qt编程中,单选框(QRadioButton)和复选框(QCheckBox)是两种常见的用户界面元素,用于实现用户的选择交互。它们是Qt Widgets模块的一部分,广泛应用于各种图形用户界面应用中。本教程将深入讲解Qt中的单选框与...

    经典Labview自定义控件素材包

    2. **按钮**:执行特定操作的交互控件,如普通按钮、复选框、单选按钮,以及各种形状的触发按钮,它们能启动函数或者改变程序流程。 3. **编辑框**:允许用户输入数据或文本的控件,如数值输入框、字符串输入框,...

    iphone单选框复选框示例

    总之,iPhone上的单选框和复选框实现主要依赖自定义UI组件,结合`UIButton`或`UISwitch`,并通过调整图片和大小来满足设计需求。在"CheckBoxDemo"项目中,你可能会看到这些概念的具体实现,包括手势处理、状态管理...

    MFC CListBox及CTreeCtrl具有复选框功能

    要为CListBox添加复选框,我们需要自定义控件,这涉及到重绘和处理消息映射。 1. **重绘复选框**:可以通过覆盖CListBox的`OnDrawItem`成员函数来绘制复选框。在该函数中,你需要使用`CDC`类的绘图方法(如`...

    CSS3实现的多种复选框和单选按钮美化效果源码.zip

    本资源"CSS3实现的多种复选框和单选按钮美化效果源码.zip"正是利用了CSS3的特性来改进传统的HTML复选框(checkbox)和单选按钮(radio button)的显示效果,使得这些交互元素不仅具有功能性,而且更具视觉吸引力。...

    基于CSS3实现的复选框和单选按钮美化的动态特效.zip

    例如,可以隐藏原有的复选框或单选按钮,然后用自定义的图形元素(如`&lt;div&gt;`或`&lt;span&gt;`)来替换它们的视觉表示。当用户选择某个选项时,通过`:checked`伪类改变自定义元素的样式,从而实现美化效果。 此外,CSS3还...

    Jquery复选框美化

    "Jquery复选框美化"和"单选按钮美化"正是关注这个领域的技术实践。jQuery,一个强大的JavaScript库,为开发者提供了丰富的API和插件,使得这些基础的HTML元素能够变得更加吸引人和功能强大。 首先,复选框和单选...

    纯css实现适配谷歌、火狐的自定义多选框、单选框颜色

    以上步骤基本涵盖了纯CSS实现自定义多选框和单选框颜色的方法。在实际项目中,你可能还需要考虑更多的细节,比如响应式设计、触屏设备的交互以及更复杂的图形设计。通过不断的实践和优化,可以创建出既美观又实用的...

Global site tag (gtag.js) - Google Analytics