使用UICollectionView 实现横向滚动标签

2020-05-07  本文已影响0人  大橙子与小佳阳

效果图:


截屏2020-05-07 12.03.07.png

首先创建UICollectionView:

- (void)awakeFromNib {
    
    [super awakeFromNib];
    [self.contentView addSubview:self.collectionView];
}
#pragma mark ==================== collectionView ====================
-(UICollectionView *)collectionView{

    if(!_collectionView){
        
        UICollectionViewFlowLayout*layout=[[UICollectionViewFlowLayout alloc]init];
        layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
        _collectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, HeightScale(15), SCREEN_WIDTH, HeightScale(60)) collectionViewLayout:layout];
        [_collectionView registerClass:[LearningLabCollectionViewCell class] forCellWithReuseIdentifier:_learLab];
        _collectionView.showsVerticalScrollIndicator = FALSE;
        _collectionView.showsHorizontalScrollIndicator = FALSE;
        _collectionView.backgroundColor = [UIColor myColorWithString:@"F5F5F5"];
        _collectionView.delegate =self;
        _collectionView.dataSource =self;
    }
    return _collectionView;
}


-(void)setModelLab:(LearningDetailModelLabType *)modelLab{
    
    _modelLab = modelLab;
    [self.collectionView reloadData];
}
//定义展示的UICollectionViewCell的个数
-(NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:(NSInteger)section{

    return _modelLab.data.count;
}

//定义展示的Section的个数
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView*)collectionView{
    
    return 1;
}
//每个UICollectionView展示的内容
-(UICollectionViewCell*)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(NSIndexPath*)indexPath{
    
    LearningLabCollectionViewCell *cell =[collectionView dequeueReusableCellWithReuseIdentifier:_learLab forIndexPath:indexPath];
    cell.model = _modelLab.data[indexPath.row];
    return cell;
}
#pragma mark --UICollectionViewDelegate

//UICollectionView被选中时调用的方法
-(void)collectionView:(UICollectionView*)collectionView didSelectItemAtIndexPath:(NSIndexPath*)indexPath{
    
    //遍历数据源 取消所有点击 isSelect全部都设置成NO
    for (LearningDetailModelLabTypeData *modelSelect in _modelLab.data) {
        modelSelect.isSelect = NO;
    }
    //改变点击标签的Select 
    LearningDetailModelLabTypeData *model = _modelLab.data[indexPath.row];
    model.isSelect = YES;
    //让你点中index 自动滚动到中间  横向水平滑动 加入动画
    [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
         //刷新collectionView
    [self.collectionView reloadData];
}
//返回这个UICollectionViewCell是否可以被选择
-(BOOL)collectionView:(UICollectionView*)collectionView shouldSelectItemAtIndexPath:(NSIndexPath*)indexPath{
    return YES;
}
#pragma mark --UICollectionViewDelegateFlowLayout
//定义每个UICollectionView 的大小
- (CGSize)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath*)indexPath{
    
    LearningDetailModelLabTypeData *model = _modelLab.data[indexPath.row];
//这里用了 计算 字符串的长度 来获取宽度+标签两遍的宽度
    CGFloat labWith =  [NSString contentRect:model.value textFount:[UIFont systemFontOfSize:WidthScale(15)]].size.width + WidthScale(15);

    return CGSizeMake(labWith,HeightScale(30));
}

//定义每个UICollectionView 的边距
-(UIEdgeInsets)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
//边距的顺序是 上左下右
  return UIEdgeInsetsMake(HeightScale(0),WidthScale(15),0,WidthScale(15));
}


- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

UICollectionViewCell.m 自定义试图:

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        
        [self setUI];
    }
    return self;
}
-(void)setModel:(LearningDetailModelLabTypeData *)model{
    
    self.tileLab.text = model.value;
//这里判断点中状态 改变标签的颜色
    if (model.isSelect) {
        
        [self labSelect];

    }else{
        
        [self labNoSelect];
    }
}
-(void)setUI{
//自定义标签
    [self.contentView addSubview:self.tileLab];
//约束
    [self.tileLab mas_makeConstraints:^(MASConstraintMaker *make) {
        make.height.equalTo(self);
        make.width.equalTo(self);
    }];
}
-(UILabel *)tileLab{
    
    if(!_tileLab){
        
        _tileLab = [[UILabel alloc]init];
        _tileLab.layer.masksToBounds = YES;
        _tileLab.layer.cornerRadius = WidthScale(3);
        _tileLab.textAlignment = NSTextAlignmentCenter;
        _tileLab.font = [UIFont systemFontOfSize:WidthScale(15)];
        _tileLab.backgroundColor = [UIColor myColorWithString:@"EEEEEE"];
        _tileLab.textColor = [UIColor myColorWithString:@"909090"];
    }
    return _tileLab;;
}
//选中改变颜色
-(void)labNoSelect{
    
    _tileLab.backgroundColor = [UIColor myColorWithString:@"EEEEEE"];
    _tileLab.textColor = [UIColor myColorWithString:@"909090"];
    
}
//选中改变颜色
-(void)labSelect{
    
    _tileLab.backgroundColor = [UIColor whiteColor];
    _tileLab.textColor = [UIColor myColorWithString:FF7];
}
上一篇下一篇

猜你喜欢

热点阅读