平時(shí)我們?cè)陧?xiàng)目開發(fā)中帮寻,對(duì)于一般的需求使用系統(tǒng)默認(rèn)的按鈕組控件即可完成旺订。但是有的時(shí)候弄企,由于用戶的需求,默認(rèn)控件既不美觀也不是很實(shí)用耸峭,所以這里就自己封裝一個(gè)稍微美觀的控件桩蓉。
SegmentView.h
//定義block淋纲,用來傳遞點(diǎn)擊的第幾個(gè)按鈕
typedef void (^PassValueBlock)(NSInteger index);
在.h文件中需要聲明一個(gè)block用來傳遞點(diǎn)擊按鈕組的標(biāo)記劳闹,通知使用該類點(diǎn)擊的是第幾個(gè)按鈕。
SegmentView.m
NSInteger _itemCounts;//控件的數(shù)目
NSArray *_titleArray;//存放title
float _itemWidth;//單個(gè)按鈕的寬度
UIImageView *_selectImage; //選中背景圖
在這里需要設(shè)置幾個(gè)屬性,需要幾個(gè)按鈕組本涕,每個(gè)按鈕組的名稱业汰,單個(gè)按鈕的寬度实胸,選中按鈕的背景(可以不設(shè)置)铜秆。
在這里還需要聲明一個(gè)方法,供其它類來調(diào)用长捧,傳入一個(gè)title數(shù)組即可晦闰。我這里用的是復(fù)寫init方法放祟。
//初始化按鈕組,傳入frame和名稱
-(id)initWithFrame:(CGRect)frame withTitleArray:(NSArray *)array;
這樣拿到title數(shù)組呻右,就可以設(shè)置控件的數(shù)目跪妥,名稱和每個(gè)按鈕的寬度。
利用for循環(huán)創(chuàng)建按鈕組声滥,根據(jù)每個(gè)按鈕的個(gè)數(shù)和寬度來進(jìn)行設(shè)置眉撵。
//循環(huán)創(chuàng)建按鈕
for (int i = 0; i < _itemCounts; i++) {
UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(i *_itemWidth, 0, _itemWidth, self.frame.size.height)];
[self addSubview:button];
//設(shè)置button的字
[button setTitle:_titleArray[i] forState:UIControlStateNormal];
//設(shè)置button的字顏色
[button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor orangeColor] forState:UIControlStateSelected];
//設(shè)置字體大小
button.titleLabel.font = [UIFont systemFontOfSize:20];
//設(shè)置居中顯示
button.titleLabel.textAlignment = NSTextAlignmentCenter;
//設(shè)置tag值
button.tag = 1000 + i;
//添加點(diǎn)擊事件
[button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
//如果是第一個(gè),默認(rèn)被選中
if (i == 0) {
button.selected = YES;
button.titleLabel.font = [UIFont systemFontOfSize:30];
}
}
同時(shí)設(shè)置默認(rèn)選中第一個(gè)按鈕落塑,之間對(duì)按鈕組的樣式進(jìn)行了設(shè)計(jì)纽疟,可以根據(jù)自己的需求靈活修改。
在按鈕點(diǎn)擊事件觸發(fā)后憾赁,先把所有的按鈕設(shè)置為未點(diǎn)擊狀態(tài)污朽,然后再將點(diǎn)擊的按鈕設(shè)置為選中狀態(tài)。并且通過tag值來設(shè)置背景圖片的位置龙考。
//當(dāng)button被點(diǎn)擊膘壶,所有的button都設(shè)為未選中狀態(tài)
for (UIView *view in self.subviews) {
if ([view isKindOfClass:[UIButton class]]) {
UIButton *subButton = (UIButton*)view;
subButton.selected = NO;
subButton.titleLabel.font = [UIFont systemFontOfSize:20];
}
}
//然后將選中的這個(gè)button變?yōu)檫x中狀態(tài)
button.selected = YES;
button.titleLabel.font = [UIFont systemFontOfSize:30];
//通過當(dāng)前的tag值設(shè)置select的位置
NSInteger index = button.tag - 1000;
[UIView animateWithDuration:.3 animations:^{
_selectImage.frame = CGRectMake(index*_itemWidth, _selectImage.frame.origin.y, _selectImage.frame.size.width, _selectImage.frame.size.height);
}];
最后一步,在通過聲明的block將點(diǎn)擊的按鈕是第幾個(gè)傳遞出來即可洲愤。
_returnBlock(index);
ViewController.m
直接在特定的類中使用即可颓芭,這里需要注意的是,一定不要忘了獲取block傳遞的值柬赐,不獲取會(huì)導(dǎo)致程序崩潰亡问。
SegmentView *segmentV = [[SegmentView alloc]initWithFrame:frame withTitleArray:titleArr];
[self.view addSubview:segmentV];
//獲取返回值
[segmentV setReturnBlock:^(NSInteger index) {
NSLog(@"%ld",(long)index);
}];