改變世界
平時我們在項目開發(fā)中,對于一般的需求使用系統(tǒng)默認的按鈕組控件即可完成。但是有的時候,由于用戶的需求,默認控件既不美觀也不是很實用,所以這里就自己封裝一個稍微美觀的控件。
效果圖展示
SegmentView.h
//定義block,用來傳遞點擊的第幾個按鈕
typedef void (^PassValueBlock)(NSInteger index);
在.h文件中需要聲明一個block用來傳遞點擊按鈕組的標記,通知使用該類點擊的是第幾個按鈕。
SegmentView.m
NSInteger _itemCounts;//控件的數(shù)目
NSArray *_titleArray;//存放title
float _itemWidth;//單個按鈕的寬度
UIImageView *_selectImage; //選中背景圖
在這里需要設置幾個屬性,需要幾個按鈕組,每個按鈕組的名稱,單個按鈕的寬度,選中按鈕的背景(可以不設置)。
在這里還需要聲明一個方法,供其它類來調(diào)用,傳入一個title數(shù)組即可。我這里用的是復寫init方法。
//初始化按鈕組,傳入frame和名稱
-(id)initWithFrame:(CGRect)frame withTitleArray:(NSArray *)array;
這樣拿到title數(shù)組,就可以設置控件的數(shù)目,名稱和每個按鈕的寬度。
利用for循環(huán)創(chuàng)建按鈕組,根據(jù)每個按鈕的個數(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];
//設置button的字
[button setTitle:_titleArray[i] forState:UIControlStateNormal];
//設置button的字顏色
[button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor orangeColor] forState:UIControlStateSelected];
//設置字體大小
button.titleLabel.font = [UIFont systemFontOfSize:20];
//設置居中顯示
button.titleLabel.textAlignment = NSTextAlignmentCenter;
//設置tag值
button.tag = 1000 + i;
//添加點擊事件
[button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
//如果是第一個,默認被選中
if (i == 0) {
button.selected = YES;
button.titleLabel.font = [UIFont systemFontOfSize:30];
}
}
同時設置默認選中第一個按鈕,之間對按鈕組的樣式進行了設計,可以根據(jù)自己的需求靈活修改。
在按鈕點擊事件觸發(fā)后,先把所有的按鈕設置為未點擊狀態(tài),然后再將點擊的按鈕設置為選中狀態(tài)。并且通過tag值來設置背景圖片的位置。
//當button被點擊,所有的button都設為未選中狀態(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];
}
}
//然后將選中的這個button變?yōu)檫x中狀態(tài)
button.selected = YES;
button.titleLabel.font = [UIFont systemFontOfSize:30];
//通過當前的tag值設置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將點擊的按鈕是第幾個傳遞出來即可。
_returnBlock(index);
ViewController.m
直接在特定的類中使用即可,這里需要注意的是,一定不要忘了獲取block傳遞的值,不獲取會導致程序崩潰。
SegmentView *segmentV = [[SegmentView alloc]initWithFrame:frame withTitleArray:titleArr];
[self.view addSubview:segmentV];
//獲取返回值
[segmentV setReturnBlock:^(NSInteger index) {
NSLog(@"%ld",(long)index);
}];