iOS 无限添加的标题滑块

先上个效果图

 

 

 

自己写了无限滑块的类 继承UIView 

直接使用 init 方法 可以定义每个标题 的颜色 下划线 颜色 选中的颜色 和frame 标题的font

 

直接上代码:

EJ_sliderHeader.h 

#import <UIKit/UIKit.h>

 

@interface EJ_sliderHeader : UIView

 

-(instancetype)initWithArray:(NSArray*)Data WithSliderColor:(UIColor*)slidercolor WithTitleColor:(UIColor*)titleColor WithtitleFont:(UIFont*)font WithBlock:(void(^)(NSInteger))Block;

 

/**

 无限延伸的滑块标题

 

 @param frame 整个空间frame

 @param Data string数组

 @param slidercolor 下划线和选中标题颜色

 @param titleColor 标题颜色

 @param font 标题字体

 @param Block 回调方法

 @return 实例

 */

-(instancetype)initWithFrame:(CGRect)frame WithArray:(NSArray*)Data WithSliderColor:(UIColor*)slidercolor WithTitleColor:(UIColor*)titleColor WithtitleFont:(UIFont*)font WithBlock:(void(^)(NSInteger))Block;

 

 

 

@property(nonatomic,copy) void(^clickToSendBack)(NSInteger index) ;

 

 

/**

 跳转到指定位置

 

 @param index 下标代表要选中的标题

 */

-(void)changeIndex:(NSInteger)index ;

-(void)indexPathRowAdd ;

-(void)indexPathRowCut ;

@end

.m文件

EJ_sliderHeader.m

 

//

//  EJ_sliderHeader.m

//  ejlShop

//

//  Created by yunfutai on 2018/2/7.

//  Copyright © 2018年 JasonGor. All rights reserved.

//

 

#import "EJ_sliderHeader.h"

@interface EJ_sliderHeader()

@property(nonatomic,strong) UIColor * BTNTitleColor ;

@property(nonatomic,strong) UIColor * sliderColor ;

@property(nonatomic,strong) UIFont * btnFont ;

@end

@implementation EJ_sliderHeader{

    UIScrollView * _scrollerBackground;

    NSArray * dataArray;

    UIView * sliderLine ;

    int selecedIndex ;

    

}

#define buttonWidth 83

#define pageScrollerCount 4

-(instancetype)initWithArray:(NSArray *)Data WithSliderColor:(UIColor *)slidercolor WithTitleColor:(UIColor *)titleColor WithtitleFont:(UIFont *)font WithBlock:(void (^)(NSInteger))Block{

    if (self = [super initWithFrame:CGRectMake(0, adaIPhoneX(64), EJScreenW, 45)]) {

       

        dataArray                          = Data;

        _BTNTitleColor                      = titleColor ;

        _sliderColor                        = slidercolor ;

        _btnFont                            = font;

        self.clickToSendBack = Block;

         [self makeupSubView];

    }

    

    return self;

}

 

-(instancetype)initWithFrame:(CGRect)frame WithArray:(NSArray *)Data WithSliderColor:(UIColor *)slidercolor WithTitleColor:(UIColor *)titleColor WithtitleFont:(UIFont *)font WithBlock:(void (^)(NSInteger))Block{

    

    if (self = [super initWithFrame:frame]) {

        

        dataArray                          = Data;

        _BTNTitleColor                      = titleColor ;

        _sliderColor                        = slidercolor ;

        _btnFont                            = font; 

        self.clickToSendBack = Block;

        _scrollerBackground = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];

        _scrollerBackground.pagingEnabled = NO ;

        _scrollerBackground.showsHorizontalScrollIndicator = NO ;

        [self addSubview:_scrollerBackground];

        [self makeupSubView];

        

        self.layer.shadowColor = [UIColor blackColor].CGColor;

        self.layer.shadowOpacity = 0.2f ;

        self.layer.shadowOffset = CGSizeMake(1, 4);

    }

    

    return self;

}

 

 

-(void)makeupSubView{

   CGFloat btnWidth;

    if (dataArray.count>pageScrollerCount) {

        btnWidth =buttonWidth;

        _scrollerBackground.contentSize = CGSizeMake(btnWidth*(dataArray.count), self.height);

        _scrollerBackground.backgroundColor = [UIColor whiteColor];

    }else{

        btnWidth = self.width/dataArray.count ;

    }

    selecedIndex = 0 ;

    for (int i=0; i<dataArray.count; i++) {

        UIButton * btn =[UIButton new];

        [_scrollerBackground addSubview:btn];

        btn.sd_layout

        .topEqualToView(_scrollerBackground)

        .leftSpaceToView(_scrollerBackground, i*btnWidth)

        .widthIs(btnWidth)

        .heightIs(_scrollerBackground.height);

        btn.tag=i ;

        [btn setTitle:dataArray[i] forState:UIControlStateNormal];

        [btn.titleLabel setFont:_btnFont];

        if (i==0) {

          [btn setTitleColor:_sliderColor forState:UIControlStateNormal];

        }else{

          [btn setTitleColor:_BTNTitleColor forState:UIControlStateNormal];

        }

         [btn addTarget:self action:@selector(btnMethod:) forControlEvents:UIControlEventTouchUpInside];

        [btn.titleLabel setFont:EJFont_DIY6(12)];

        btn.backgroundColor = [UIColor whiteColor];

 

        

    }

    for (int i =1 ; i<dataArray.count; i++) {

        UIView * line = [[UIView alloc]initWithFrame:CGRectMake(btnWidth*i, 0, 0.5, self.height)];

        line.backgroundColor = RGBA(241, 241, 241, 1);

        [_scrollerBackground addSubview:line];

    }

    

    UIView * bomLine = [[UIView alloc]initWithFrame:CGRectMake(0, self.height -0.5, EJScreenW , 0.5)];

    bomLine.backgroundColor = RGBA(241, 241, 241, 1);

    [_scrollerBackground addSubview:bomLine];

    

    sliderLine = [[UIView alloc]initWithFrame:CGRectMake(0, self.height - 1, btnWidth, 2)];

    sliderLine.backgroundColor = _sliderColor ;

    [_scrollerBackground addSubview:sliderLine];

    

    

}

#pragma mark -按钮点击事件

-(void)btnMethod:(UIButton*)sender{

    for (UIView * sub in _scrollerBackground.subviews) {

        if ([sub isKindOfClass:[UIButton class]] ) {

            UIButton * subBTN = (UIButton*)sub;

            [subBTN setTitleColor:_BTNTitleColor forState:UIControlStateNormal];

            

        }

        

    }

    [sender setTitleColor:_sliderColor forState:UIControlStateNormal];

    CGFloat btnWidth;

    if (dataArray.count>pageScrollerCount) {

        btnWidth = buttonWidth ;

    }else{

        btnWidth = self.width/dataArray.count ;

    }

    selecedIndex = (int)sender ;

    

    [UIView animateWithDuration:0.3f animations:^{

        sliderLine.x = sender.tag *btnWidth;

        

        

    } completion:^(BOOL finished) {

        self.clickToSendBack(sender.tag);

    }];

    

}

#pragma mark -根据下标改变line

-(void)changeIndex:(NSInteger)index{

    for (UIView * sub in self.subviews) {

        if ([sub isKindOfClass:[UIButton class]] ) {

            UIButton * subBTN = (UIButton*)sub;

            [subBTN setTitleColor:_BTNTitleColor forState:UIControlStateNormal];

            

            if (subBTN.tag == index) {

                  [subBTN setTitleColor:_sliderColor forState:UIControlStateNormal];

            }

        }

        

    }

    selecedIndex = (int)index ;

  

    CGFloat btnWidth = self.width/dataArray.count ;

    

    

    [UIView animateWithDuration:0.3f animations:^{

        sliderLine.x = index *btnWidth;

        

        

    } completion:^(BOOL finished) {

        self.clickToSendBack(index);

    }];

}

 

 

-(void)indexPathRowAdd {

    

    selecedIndex ++ ;

    

    if (selecedIndex == dataArray.count) {

        selecedIndex=0 ;

    }

    

    

    for (UIView * sub in self.subviews) {

        if ([sub isKindOfClass:[UIButton class]] ) {

            UIButton * subBTN = (UIButton*)sub;

            [subBTN setTitleColor:_BTNTitleColor forState:UIControlStateNormal];

            

            if (subBTN.tag == selecedIndex) {

                [subBTN setTitleColor:_sliderColor forState:UIControlStateNormal];

            }

        }

        

    }

 

    

    CGFloat btnWidth = self.width/dataArray.count ;

    

    

    [UIView animateWithDuration:0.3f animations:^{

        sliderLine.x = selecedIndex *btnWidth;

        

        

    } completion:^(BOOL finished) {

        self.clickToSendBack(selecedIndex);

    }];

}

-(void)indexPathRowCut {

    selecedIndex -- ;

    

    if (selecedIndex < 0) {

        selecedIndex= (int)(dataArray.count-1) ;

    }

    

    

    for (UIView * sub in self.subviews) {

        if ([sub isKindOfClass:[UIButton class]] ) {

            UIButton * subBTN = (UIButton*)sub;

            [subBTN setTitleColor:_BTNTitleColor forState:UIControlStateNormal];

            

            if (subBTN.tag == selecedIndex) {

                [subBTN setTitleColor:_sliderColor forState:UIControlStateNormal];

            }

        }

        

    }

    

    

    CGFloat btnWidth = self.width/dataArray.count ;

    

    

    [UIView animateWithDuration:0.3f animations:^{

        sliderLine.x = selecedIndex *btnWidth;

        

        

    } completion:^(BOOL finished) {

        self.clickToSendBack(selecedIndex);

    }];

}

@end

 

posted @ 2018-06-27 12:05  jsonLing  阅读(243)  评论(0编辑  收藏  举报