基于系统的封装SegmentView类

来源:互联网 发布:奥拉朱旺数据 编辑:程序博客网 时间:2024/05/16 17:48

基于系统的封装segmentView类,可以自定义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);}

//#pragma mark -

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

效果演示:

gif1.gif

0 0
原创粉丝点击