自定义UISegmentView类,可以设置item数量,选中item颜色,背景视图颜色,下划线颜色和高度,选中item下划线颜色和高度,添加左右滑动切换item事件。
在MZLSegmentView.h中声明协议方法:
//协议方法
@protocol MZLSegmentViewDelegate <NSObject>
@optional
- (void)onSegmentClinkAtIndex:(NSInteger)index;
@end
@interface MZLSegmentView : UIView
@property(nonatomic,weak)id<MZLSegmentViewDelegate> delegate;
@property(nonatomic,strong)NSMutableArray *itemNameArr; //名字数组
@property(nonatomic,assign)NSInteger currentIndex; //当前选择索引
@property(nonatomic,strong)UIColor *selectLineColor; //选择粗线的颜色
@property(nonatomic,strong)UIColor *bottomLineColor; //底线的颜色
@property(nonatomic,strong)UIColor *fontColor; //字体颜色
//设置当前选中项
- (void)setCurrentIndexWithoutAnimation:(NSInteger)currentIndex;
//设置底部线条的高度和选择线条的高度
- (void)setBottomLineHeight:(CGFloat)bHeight SelectHeight:(CGFloat)sHeight;
@end
在MZLSegmentView.m中实现协议方法:
@interface MZLSegmentView()
{
UIView *selectView;
UIView *bottomView;
CGFloat btHeight;
CGFloat slHeight;
}
@end
实现方法
@implementation MZLSegmentView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
self.backgroundColor = [UIColor colorWithRed:238.0/255.0 green:238.0/255.0 blue:238.0/255.0 alpha:1.0];
btHeight = 3;
slHeight = 7;
bottomView = [[UIView alloc]initWithFrame:CGRectMake(0, frame.size.height - btHeight, frame.size.width, btHeight)];
bottomView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
bottomView.backgroundColor = [UIColor greenColor];
[self addSubview:bottomView];
selectView = [[UIView alloc]init];
selectView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
selectView.backgroundColor = [UIColor redColor];
[self addSubview:selectView];
UISwipeGestureRecognizer *doSwipLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(doSwip:)];
doSwipLeft.direction = UISwipeGestureRecognizerDirectionLeft;
[self addGestureRecognizer:doSwipLeft];
UISwipeGestureRecognizer *doSwipRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(doSwip:)];
doSwipRight.direction = UISwipeGestureRecognizerDirectionRight;
[self addGestureRecognizer:doSwipRight];
self.currentIndex = 0;
}
return self;
}
设置当前选中item的底线颜色
- (void)setSelectLineColor:(UIColor *)selectLineColor
{
selectView.backgroundColor = selectLineColor;
}
设置全部底线的颜色
- (void)setBottomLineColor:(UIColor*)bottomLineColor
{
bottomView.backgroundColor = bottomLineColor;
}
设置字体颜色
- (void)setFontColor:(UIColor *)fontColor
{
for (int i = 0; i < _itemNameArr.count; i++)
{
UIButton *btn = (UIButton*)[self viewWithTag:1000 + i];
[btn setTitleColor:fontColor forState:UIControlStateNormal];
[btn setTitleColor:fontColor forState:UIControlStateHighlighted];
}
}
设置底部线条和选择线条的高度
- (void)setBottomLineHeight:(CGFloat)bHeight SelectHeight:(CGFloat)sHeight
{
btHeight = bHeight;
slHeight = sHeight;
float fWidth = self.frame.size.width / _itemNameArr.count;
selectView.frame = CGRectMake(fWidth * _currentIndex, self.frame.size.height - sHeight, fWidth, sHeight);
bottomView.frame = CGRectMake(0, self.frame.size.height - bHeight, self.frame.size.width, bHeight);
}
layoutSubviews
- (void)layoutSubviews
{
if (_itemNameArr && _itemNameArr.count > 0)
{
float fWidth = self.frame.size.width / _itemNameArr.count;
selectView.frame = CGRectMake(fWidth * _currentIndex, self.frame.size.height - slHeight, fWidth, slHeight);
for (int i = 0; i < _itemNameArr.count; i++)
{
UIButton *btn = (UIButton*)[self viewWithTag:1000 + i];
btn.frame = CGRectMake(i * fWidth, 0, fWidth, self.frame.size.height - slHeight);
}
}
}
左右滑动切换事件
- (void)doSwip:(id)sender
{
UISwipeGestureRecognizer* gesture = (UISwipeGestureRecognizer*)sender;
if (gesture.direction == UISwipeGestureRecognizerDirectionRight)
{
NSInteger index = --self.currentIndex;
if (index < 0)
index = 0;
self.currentIndex = index;
}
else if (gesture.direction == UISwipeGestureRecognizerDirectionLeft)
{
NSInteger index = ++self.currentIndex;
if (index > _itemNameArr.count - 1)
index = _itemNameArr.count - 1;
self.currentIndex = index;
}
if (_delegate && [_delegate respondsToSelector:@selector(onSegmentClinkAtIndex:)])
{
[_delegate onSegmentClinkAtIndex:self.currentIndex];
}
}
设置itemArr数组
- (void)setItemNameArr:(NSMutableArray *)itemNameArr
{
_itemNameArr = itemNameArr;
if (_itemNameArr && _itemNameArr.count)
{
float fWidth = self.frame.size.width / _itemNameArr.count;
for (int i = 0; i < _itemNameArr.count; i++)
{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
if (i == 0) btn.selected = YES;
btn.backgroundColor = [UIColor clearColor];
btn.frame = CGRectMake(i * fWidth, 0, fWidth, self.frame.size.height - 7);
btn.tag = 1000 + i;
[btn setTitle:_itemNameArr[i] forState:UIControlStateNormal];
[btn setTitle:_itemNameArr[i] forState:UIControlStateHighlighted];
btn.titleLabel.font = [UIFont systemFontOfSize:15.0f];
[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[btn setTitleColor:[UIColor redColor] forState:UIControlStateSelected];
[btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:btn];
}
}
}
当前选中item事件
- (void)btnAction:(id)sender
{
for (int i = 0; i < _itemNameArr.count; i++) {
UIButton *btnTmp = (UIButton*)[self viewWithTag:1000+i];
btnTmp.selected = NO;
}
UIButton *btn = (UIButton*)sender;
btn.selected = YES;
NSInteger index = btn.tag - 1000;
if (self.currentIndex == index)
{
return;
}
self.currentIndex = index;
}
当前选中索引实现代理方法
- (void)setCurrentIndex:(NSInteger)currentIndex
{
if (currentIndex == _currentIndex) return;
_currentIndex = currentIndex;
if (self.itemNameArr && self.itemNameArr.count)
{
float fWidth = self.frame.size.width / self.itemNameArr.count;
CGRect rect = selectView.frame;
rect.origin.x = fWidth * _currentIndex;
[UIView animateWithDuration:0.3 animations:^{
selectView.frame = rect;
if (_delegate && [_delegate respondsToSelector:@selector(onSegmentClinkAtIndex:)])
{
[_delegate onSegmentClinkAtIndex:_currentIndex];
}
} completion:^(BOOL finshed){
}];
}
}
设置当前选中项
- (void)setCurrentIndexWithoutAnimation:(NSInteger)currentIndex
{
if (currentIndex == _currentIndex) return;
_currentIndex = currentIndex;
if (self.itemNameArr && self.itemNameArr.count)
{
float fWidth = self.frame.size.width / self.itemNameArr.count;
CGRect rect = selectView.frame;
rect.origin.x = fWidth * _currentIndex;
selectView.frame = rect;
if (_delegate && [_delegate respondsToSelector:@selector(onSegmentClinkAtIndex:)])
{
[_delegate onSegmentClinkAtIndex:_currentIndex];
}
}
}
@end
在控制器中创建MZLSegmentView类:
- (void)viewDidLoad {
[super viewDidLoad];
MZLSegmentView *segmentView = [[MZLSegmentView alloc] initWithFrame:CGRectMake(0, 64, Width, 44)];
segmentView.backgroundColor = [UIColor yellowColor];
segmentView.itemNameArr = [NSMutableArray arrayWithArray:@[@"test1",@"test2",@"test3",@"test4"]];
segmentView.delegate = (id<MZLSegmentViewDelegate>)self;
[segmentView setBottomLineHeight:1 SelectHeight:3];
[self.view addSubview:segmentView];
}
简单效果演示: