JXCategoryView框架的使用01#
JXCategoryView框架的使用01#
当前总行数:0 行
其他功能#
/// 手动跳转到某个指定的页面
[self.categoryTitleView selectItemAtIndex:3];一些共同的准备工作#
#if __has_include(<JXCategoryView/JXCategoryView.h>)
#import <JXCategoryView/JXCategoryView.h>
#else
#import "JXCategoryView.h"
#endif
<JXCategoryTitleViewDataSource
,JXCategoryListContainerViewDelegate
,JXCategoryViewDelegate>图文结合#
方式一
============================== 方式一 ==============================
-(JXCategoryTitleView *)categoryView{
if (!_categoryView) {
_categoryView = JXCategoryTitleView.new;
_categoryView.backgroundColor = UIColor.clearColor;
_categoryView.titleSelectedColor = UIColor.whiteColor;
_categoryView.titleColor = UIColor.whiteColor;
_categoryView.titleFont = [UIFont systemFontOfSize:18 weight:UIFontWeightRegular];
_categoryView.titleSelectedFont = [UIFont systemFontOfSize:28 weight:UIFontWeightRegular];
_categoryView.delegate = self;
_categoryView.titles = self.titleMutArr;
_categoryView.titleColorGradientEnabled = YES;
_categoryView.indicators = @[self.lineView];//
_categoryView.defaultSelectedIndex = 1;// 默认从第二个开始显示
_categoryView.cellSpacing = JobsWidth(-20);
// 关联cotentScrollView,关联之后才可以互相联动!!!
_categoryView.contentScrollView = self.listContainerView.scrollView;//
[self.view addSubview:_categoryView];
[_categoryView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.infoBoardView.mas_bottom).offset(0);
make.left.right.equalTo(self.view);
make.height.mas_equalTo(listContainerViewDefaultOffset);
}];
[self.view layoutIfNeeded];
}return _categoryView;
}方式二
============================== 方式二 ==============================
-(JXCategoryImageView *)categoryView{
if (!_categoryView) {
_categoryView = JXCategoryImageView.new;
_categoryView.backgroundColor = UIColor.clearColor;
_categoryView.delegate = self;
_categoryView.imageNames = @[@"彩票_已选择",@"电子_已选择",@"棋牌_已选择",@"全部游戏_已选择",@"体育_已选择",@"真人直播_已选择"];
_categoryView.selectedImageNames = @[@"彩票_已选择",@"电子_已选择",@"棋牌_已选择",@"全部游戏_已选择",@"体育_已选择",@"真人直播_已选择"];
//_categoryView.imageInfoArray = @[@"彩票_已选择",@"电子_已选择",@"棋牌_已选择",@"全部游戏_已选择",@"体育_已选择",@"真人直播_已选择"];
//@[KIMG(@"彩票_已选择"),KIMG(@"电子_已选择"),KIMG(@"棋牌_已选择"),KIMG(@"全部游戏_已选择"),KIMG(@"体育_已选择"),KIMG(@"真人直播_已选择")];
//_categoryView.selectedImageInfoArray = @[@"彩票_已选择",@"电子_已选择",@"棋牌_已选择",@"全部游戏_已选择",@"体育_已选择",@"真人直播_已选择"];
_categoryView.imageSize = CGSizeMake(JobsWidth(30), JobsWidth(30));
_categoryView.imageCornerRadius = JobsWidth(8);
_categoryView.imageZoomEnabled = YES;
_categoryView.imageZoomScale = 2;
_categoryView.indicators = @[self.lineView];//
_categoryView.defaultSelectedIndex = 1;// 默认从第二个开始显示
_categoryView.cellSpacing = JobsWidth(-20);
// 关联cotentScrollView,关联之后才可以互相联动!!!
_categoryView.contentScrollView = self.listContainerView.scrollView;//
[self.view addSubview:_categoryView];
[_categoryView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.infoBoardView.mas_bottom).offset(0);
make.left.right.equalTo(self.view);
make.height.mas_equalTo(listContainerViewDefaultOffset);
}];
[self.view layoutIfNeeded];
}return _categoryView;
}方式三
============================== 方式三 ==============================
@property(nonatomic,strong)NSMutableArray <NSNumber *>*dotStatesMutArr;
-(JXCategoryDotView *)categoryTitleView{
if (!_categoryTitleView) {
_categoryTitleView = JXCategoryDotView.new;
_categoryTitleView.delegate = self;
_categoryTitleView.dotStates = self.dotStatesMutArr;
_categoryTitleView.titles = self.titleMutArr;
_categoryTitleView.indicators = @[self.lineView];
_categoryTitleView.backgroundColor = HEXCOLOR(0xFCFBFB);
_categoryTitleView.titleSelectedColor = HEXCOLOR(0xAE8330);
_categoryTitleView.titleColor = HEXCOLOR(0xC4C4C4);
_categoryTitleView.titleFont = notoSansRegular(12);
_categoryTitleView.titleSelectedFont = notoSansRegular(12);
_categoryTitleView.defaultSelectedIndex = 1;//默认从第二个开始显示
_categoryTitleView.titleColorGradientEnabled = YES;
// _categoryTitleView.titleLabelZoomEnabled = YES;//默认为NO。为YES时titleSelectedFont失效,以titleFont为准。这句话貌似有点问题,等作者回复
_categoryTitleView.listContainer = self.listContainerView;
_categoryTitleView.dotSize = CGSizeMake(JobsWidth(5), JobsWidth(5));
// 关联cotentScrollView,关联之后才可以互相联动!!!
_categoryTitleView.contentScrollView = self.listContainerView.scrollView;
[_categoryTitleView reloadDataWithoutListContainer];
[self.view addSubview:_categoryTitleView];
[_categoryTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.topLineLab.mas_bottom);
make.left.right.equalTo(self.view);
make.height.mas_equalTo(listContainerViewDefaultOffset);
}];
}return _categoryTitleView;
}
-(NSMutableArray<NSNumber *> *)dotStatesMutArr{
if (!_dotStatesMutArr) {
_dotStatesMutArr = NSMutableArray.array;
[_dotStatesMutArr addObject:@YES];
[_dotStatesMutArr addObject:@NO];
[_dotStatesMutArr addObject:@YES];
[_dotStatesMutArr addObject:@NO];
[_dotStatesMutArr addObject:@YES];
}return _dotStatesMutArr;
}
- (void)categoryView:(JXCategoryBaseView *)categoryView
didSelectedItemAtIndex:(NSInteger)index {
self.navigationController.interactivePopGestureRecognizer.enabled = (index == 0);
//点击以后红点消除
if ([self.dotStatesMutArr[index] boolValue]) {
self.dotStatesMutArr[index] = @(NO);
self.categoryTitleView.dotStates = self.dotStatesMutArr;
[categoryView reloadCellAtIndex:index];
}
}方式四
============================== 方式四 ==============================
-(JXCategoryNumberView *)categoryTitleView{
if (!_categoryTitleView) {
_categoryTitleView = JXCategoryNumberView.new;
_categoryTitleView.delegate = self;
_categoryTitleView.titles = self.titleMutArr;
_categoryTitleView.indicators = @[self.lineView];
_categoryTitleView.backgroundColor = HEXCOLOR(0xFCFBFB);
_categoryTitleView.titleSelectedColor = HEXCOLOR(0xAE8330);
_categoryTitleView.titleColor = HEXCOLOR(0xC4C4C4);
_categoryTitleView.titleFont = notoSansRegular(12);
_categoryTitleView.titleSelectedFont = notoSansRegular(12);
_categoryTitleView.defaultSelectedIndex = 1;//默认从第二个开始显示
_categoryTitleView.titleColorGradientEnabled = YES;
// _categoryTitleView.titleLabelZoomEnabled = YES;//默认为NO。为YES时titleSelectedFont失效,以titleFont为准。这句话貌似有点问题,等作者回复
_categoryTitleView.listContainer = self.listContainerView;
_categoryTitleView.counts = self.numberMutArr;
_categoryTitleView.numberLabelOffset = CGPointMake(JobsWidth(5), JobsWidth(2));
/// 内部默认不会格式化数字,直接转成字符串显示。比如业务需要数字超过999显示999+,可以通过该block实现。
_categoryTitleView.numberStringFormatterBlock = ^NSString *(NSInteger number) {
if (number > 999) {
return @"999+";
}
return [NSString stringWithFormat:@"%ld", (long)number];
};
/// 关联cotentScrollView,关联之后才可以互相联动!!!
_categoryTitleView.contentScrollView = self.listContainerView.scrollView;
[_categoryTitleView reloadDataWithoutListContainer];
[self.view addSubview:_categoryTitleView];
[_categoryTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.topLineLab.mas_bottom);
make.left.right.equalTo(self.view);
make.height.mas_equalTo(listContainerViewDefaultOffset);
}];
}return _categoryTitleView;
}公共部分
==================================== 公共部分 ====================================
#ifndef listContainerViewDefaultOffset
#define listContainerViewDefaultOffset JobsWidth(50)
#endif
// UI
/// N 选 1
@property(nonatomic,strong)JXCategoryTitleView *categoryView;/// 文字
@property(nonatomic,strong)JXCategoryImageView *categoryView;/// 纯图
@property(nonatomic,strong)JXCategoryDotView *categoryView;/// 右上角带红点
@property(nonatomic,strong)JXCategoryNumberView *categoryView;/// 右上角带文字
@property(nonatomic,strong)JXCategoryIndicatorLineView *lineView;/// 跟随的指示器
@property(nonatomic,strong)JXCategoryListContainerView *listContainerView;/// 此属性决定依附于此的viewController
// Data
@property(nonatomic,strong)NSMutableArray <NSString *>*titleMutArr;
@property(nonatomic,strong)NSMutableArray <NSString *>*imageNames;
@property(nonatomic,strong)NSMutableArray <NSString *>*selectedImageNames;
@property(nonatomic,strong)NSMutableArray <UIViewController *>*childVCMutArr;
-(JXCategoryIndicatorLineView *)lineView{
if (!_lineView) {
_lineView = JXCategoryIndicatorLineView.new;
_lineView.indicatorColor = kWhiteColor;
_lineView.indicatorHeight = JobsWidth(4);
_lineView.indicatorWidthIncrement = JobsWidth(10);
_lineView.verticalMargin = 0;
}return _lineView;
}
/// 此属性决定依附于此的viewController
-(JXCategoryListContainerView *)listContainerView{
if (!_listContainerView) {
_listContainerView = [JXCategoryListContainerView.alloc initWithType:JXCategoryListContainerType_CollectionView
delegate:self];
_listContainerView.defaultSelectedIndex = 1;// 默认从第二个开始显示
[self.view addSubview:_listContainerView];
[_listContainerView mas_makeConstraints:^(MASConstraintMaker *make) {
// make.edges.equalTo(self.view);
make.top.equalTo(self.infoBoardView.mas_bottom).offset(listContainerViewDefaultOffset);
make.left.right.bottom.equalTo(self.view);
}];
[self.view layoutIfNeeded];
/// ❤️在需要的地方写❤️
NSNumber *currentIndex = [self.listContainerView valueForKey:@"currentIndex"];
NSLog(@"滑动或者点击以后,改变控制器,得到的目前最新的index = %d",currentIndex.intValue);
}return _listContainerView;
}
-(NSMutableArray<NSString *> *)titleMutArr{
if (!_titleMutArr) {
_titleMutArr = NSMutableArray.array;
[_titleMutArr addObject:JobsInternationalization(@"全部游戏")];
[_titleMutArr addObject:JobsInternationalization(@"真人")];
[_titleMutArr addObject:JobsInternationalization(@"体育")];
[_titleMutArr addObject:JobsInternationalization(@"电子")];
[_titleMutArr addObject:JobsInternationalization(@"棋牌")];
[_titleMutArr addObject:JobsInternationalization(@"彩票")];
}return _titleMutArr;
}
-(NSMutableArray<UIViewController *> *)childVCMutArr{
if (!_childVCMutArr) {
_childVCMutArr = NSMutableArray.array;
[self.childVCMutArr addObject:BaiShaETProjAllGameVC.new];// 全部游戏
[self.childVCMutArr addObject:BaiShaETProjManVideoVC.new];// 真人
[self.childVCMutArr addObject:BaiShaETProjSportVC.new];// 体育
[self.childVCMutArr addObject:BaiShaETProjGameOnllineVC.new];// 电子
[self.childVCMutArr addObject:BaiShaETProjChessPokerVC.new];// 棋牌
[self.childVCMutArr addObject:BaiShaETProjLotteryVC.new];// 彩票
}return _childVCMutArr;
}
#pragma mark JXCategoryTitleViewDataSource
//// 如果将JXCategoryTitleView嵌套进UITableView的cell,每次重用的时候,JXCategoryTitleView进行reloadData时,会重新计算所有的title宽度。所以该应用场景,需要UITableView的cellModel缓存titles的文字宽度,再通过该代理方法返回给JXCategoryTitleView。
//// 如果实现了该方法就以该方法返回的宽度为准,不触发内部默认的文字宽度计算。
//- (CGFloat)categoryTitleView:(JXCategoryTitleView *)titleView
// widthForTitle:(NSString *)title{
//
// return 10;
//}
#pragma mark JXCategoryListContainerViewDelegate
/**
返回list的数量
@param listContainerView 列表的容器视图
@return list的数量
*/
- (NSInteger)numberOfListsInlistContainerView:(JXCategoryListContainerView *)listContainerView{
return self.titleMutArr.count;
}
/**
根据index初始化一个对应列表实例,需要是遵从`JXCategoryListContentViewDelegate`协议的对象。
如果列表是用自定义UIView封装的,就让自定义UIView遵从`JXCategoryListContentViewDelegate`协议,该方法返回自定义UIView即可。
如果列表是用自定义UIViewController封装的,就让自定义UIViewController遵从`JXCategoryListContentViewDelegate`协议,该方法返回自定义UIViewController即可。
@param listContainerView 列表的容器视图
@param index 目标下标
@return 遵从JXCategoryListContentViewDelegate协议的list实例
*/
- (id<JXCategoryListContentViewDelegate>)listContainerView:(JXCategoryListContainerView *)listContainerView
initListForIndex:(NSInteger)index{
return self.childVCMutArr[index];
}
#pragma mark JXCategoryViewDelegate
///【点击的结果】点击选中的情况才会调用该方法。传递didClickSelectedItemAt事件给listContainerView
- (void)categoryView:(JXCategoryBaseView *)categoryView
didClickSelectedItemAtIndex:(NSInteger)index {
[self.listContainerView didClickSelectedItemAtIndex:index];
}
///【点击选中或者滚动选中的结果】点击选中或者滚动选中都会调用该方法。适用于只关心选中事件,不关心具体是点击还是滚动选中的。
- (void)categoryView:(JXCategoryBaseView *)categoryView
didSelectedItemAtIndex:(NSInteger)index {
}
///【滚动选中的结果】滚动选中的情况才会调用该方法
- (void)categoryView:(JXCategoryBaseView *)categoryView
didScrollSelectedItemAtIndex:(NSInteger)index{
}
/// 传递scrolling事件给listContainerView,必须调用!!!
- (void)categoryView:(JXCategoryBaseView *)categoryView
scrollingFromLeftIndex:(NSInteger)leftIndex
toRightIndex:(NSInteger)rightIndex
ratio:(CGFloat)ratio {
NSLog(@"");
// [self.listContainerView scrollingFromLeftIndex:leftIndex
// toRightIndex:rightIndex
// ratio:ratio
// selectedIndex:categoryView.selectedIndex];
}