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