亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

自定義控件復(fù)選框和單選框的實現(xiàn)

系統(tǒng) 1903 0

我們先實現(xiàn)單個按鈕,為了復(fù)用,不管單選還是復(fù)選按鈕都是使用同一個類來實現(xiàn),為了區(qū)別單選還是復(fù)選,我們用一個自定義枚舉類型 CheckButtonStyle屬性style來區(qū)別,當(dāng)其值設(shè)置為CheckButtonStyleDefault或CheckButtonStyleBox時,為復(fù)選按鈕:

當(dāng)其值設(shè)為 CheckButtonStyleRadio時,為單選按鈕:

當(dāng)按鈕在選中/反選狀態(tài)間切換時 ,文字左邊的圖片自動轉(zhuǎn)換。

整個控件是由一個 ImageView、一個Label、一個BOOL變量及其他變量組成,.h文件如下:

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

具體實現(xiàn)如下:

#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 ]; // 默認(rèn)風(fēng)格為方框(多選)樣式

//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類很簡單,構(gòu)造、設(shè)置標(biāo)簽文本等屬性,然后addSubview:

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];

二、單選按鈕組的實現(xiàn)

復(fù)選按鈕無所謂“組”的概念,單選按鈕則不同。在同一個組中,單選按鈕只允許同時選擇一個按鈕,不能選多個,因此我們要實現(xiàn)一個單選按鈕組的類:

#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 ) {

// 實現(xiàn)單選

for ( CheckButton * each in children ){

if (each. checked ) {

[each setChecked : NO ];

}

}

[cb setChecked : YES ];

// 復(fù)制選擇的項

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中的使用:

-( 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 ];

// 把按鈕設(shè)置為單選按鈕樣式

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] 之前設(shè)置,否則 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]; // 屬性設(shè)置完之后再 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 ;

}

運行效果:

自定義控件復(fù)選框和單選框的實現(xiàn)

自定義控件復(fù)選框和單選框的實現(xiàn)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: a级在线观看视频 | 久久亚洲精品中文字幕三区 | 日本xxxwww在线观看免费 | 国产福利午夜 | 日韩精品片 | 久久成人免费视频 | 国产一区在线看 | 亚洲精品国产一区二区三 | 国产成人亚洲影视在线 | 精品亚洲成a人在线播放 | 久99久热只有精品国产99 | 欧美末成年videos在线观看 | 性做久久久久久网站 | 永久黄网站色视频免费观看 | 亚洲天堂三级 | 日本免费黄色小视频 | 久热在线 | 91精品国产91久久久久福利 | 亚洲精品一区二区在线播放 | 免费一级毛片免费播放 | 九九免费精品视频 | 女人十八毛片免费特黄 | 欧美videos肥婆hd | 中文字幕一区二区三区有限公司 | 欧美亚洲国产精品第一页 | 国产男女在线观看 | 久久国产乱子伦免费精品 | 欧美一级艳片视频免费观看 | 国产视频不卡 | 日本久久网 | 日日摸夜夜爽 | 四虎影视久久 | 色噜噜狠狠一区二区三区 | 亚洲精品久久中文字幕 | 国内精品不卡一区二区三区 | 中中文字幕乱码 | 亚洲伊人tv综合网色 | 日本一级~片免费永久 | 日韩欧美亚洲国产精品字幕久久久 | 久草视频在线免费看 | 七七久久综合 |