美文网首页
iOS - 将UICollectionViewCell滚动到菜单

iOS - 将UICollectionViewCell滚动到菜单

作者: 温柔vs先生 | 来源:发表于2022-12-06 09:37 被阅读0次

    我的是横向滑动的菜单,点击当前cell时,让其滚动到中间位置,注意要判断最左边和最右边的cell,点击时不能发生偏移,以下是我点击时的代码:

        UICollectionViewLayoutAttributes * att = [self.collectionView layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0]];
        CGFloat width = self.collectionView.width;
        if(self.collectionView.contentSize.width > width) {
            if(att.frame.origin.x > width/2.f) {
        //        NSLog(@"%f ---- %f", width/2.f, self.collectionView.contentSize.width - att.frame.origin.x);
                if(self.collectionView.contentSize.width - att.frame.origin.x - att.bounds.size.width/2.f > width/2.f) {
                    CGPoint point = CGPointMake(att.frame.origin.x - width/2.f + att.bounds.size.width/2.f , 0);
                    [self.collectionView setContentOffset:point animated:YES];
                }else {
                    [self.collectionView setContentOffset:CGPointMake(self.collectionView.contentSize.width - width, 0) animated:YES];
                }
            }else {
                [self.collectionView setContentOffset:CGPointMake(0, 0) animated:YES];
            }
        }
    

    如果不采用UICollectionView制作菜单,用UIScrollView和UIButton制作,代码如下:

    - (void)setUI {
    
        UIScrollView *topTitleSC = [[UIScrollView alloc] init];
        topTitleSC.showsHorizontalScrollIndicator = NO;
        topTitleSC.showsVerticalScrollIndicator = NO;
        [self.view addSubview:topTitleSC];
        self.titleSC = topTitleSC;
        [topTitleSC mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(self.view.mas_safeAreaLayoutGuideTop);
            make.left.equalTo(self.view.mas_safeAreaLayoutGuideLeft);
            make.right.equalTo(self.view.mas_safeAreaLayoutGuideRight);
            make.height.offset(scHeight);
        }];
        
        
        
        UIButton *selectBtn = nil;
        for (int i =0; i<self.titleArr.count; i++) {
             TYAVLableModel *model =  self.titleArr[i];
            UIButton *btn = [UIButton buttonWithTitle:model.name titleColor:main_light_text_color font:[UIFont systemFontOfSize:15] target:self action:@selector(titleBtnClick:)];
            btn.frame = CGRectMake((jianGe+btnWidth)*i+jianGe, 0, btnWidth, scHeight-1);
            btn.tag = i+100;
            [topTitleSC addSubview:btn];
            
            
            if (i == 0) {
                _lineLab = [[UILabel alloc] initWithFrame:CGRectMake(jianGe, scHeight-1, btnWidth, 1)];
                _lineLab.backgroundColor = main_select_text_color;
                [topTitleSC addSubview:_lineLab];
            }
           
            selectBtn = btn;
        }
        
        topTitleSC.contentSize = CGSizeMake(selectBtn.right+jianGe, topTitleSC.height);
    
        self.scrollView.contentSize = CGSizeMake(self.titleArr.count*KSCREEN_WIDTH, self.scrollView.height);
        
        [self addListVCWithIndex:0];
    }
    
    - (void)titleBtnClick:(UIButton *)btn {
        if(btn == _currentBtn) return;
        
        [_currentBtn setTitleColor:main_light_text_color forState:UIControlStateNormal];
        [btn setTitleColor:main_select_text_color forState:UIControlStateNormal];
    
        _lineLab.center = CGPointMake(btn.center.x, _lineLab.center.y);
        
        [UIView animateWithDuration:0.3 animations:^{
            [self.scrollView setContentOffset:CGPointMake((btn.tag-100)*KSCREEN_WIDTH, self.scrollView.contentOffset.y)  animated:NO];
        }];
        
        [self addListVCWithIndex:btn.tag-100];
        
        // 有数学公式得出的算法
        if((KSCREEN_WIDTH - btn.x) < 2*btn.width) {
            if((btn.x - (KSCREEN_WIDTH -btn.width)/2.f)<(self.titleSC.contentSize.width-KSCREEN_WIDTH)) {
                [UIView animateWithDuration:0.5 animations:^{
                    self.titleSC.contentOffset = CGPointMake(btn.x - (KSCREEN_WIDTH -btn.width)/2.f, 0);
                }];
            } else {
                [UIView animateWithDuration:0.5 animations:^{
                    self.titleSC.contentOffset = CGPointMake(self.titleSC.contentSize.width - KSCREEN_WIDTH, 0);
                }];
            }
        } else {
            [UIView animateWithDuration:0.5 animations:^{
                self.titleSC.contentOffset = CGPointMake(0, 0);
            }];
        }
        
        
        _currentBtn = btn;
    }
    
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
        
        NSInteger index = (scrollView.contentOffset.x+KSCREEN_WIDTH/2.f)/KSCREEN_WIDTH;
        UIButton *btn = (UIButton *)[self.titleSC viewWithTag:index+100];
        [self titleBtnClick:btn];
        
        [self addListVCWithIndex:(int)(scrollView.contentOffset.x/KSCREEN_WIDTH)];
    }
    
    #pragma mark - addVC
    
    - (void)addListVCWithIndex:(NSInteger)index {
        
        if (index<0||index>=self.titleArr.count) {
            return;
        }
        //根据页数添加相对应的视图 并存入数组
        
        if (![_listVCQueue objectForKey:@(index)]) {
            TYAVHomeViewController *contentVC = [[TYAVHomeViewController alloc] init];
            [self addChildViewController:contentVC];
            TYAVLableModel *model =  self.titleArr[index];
            contentVC.vClass = model.name;
    
            contentVC.view.frame = CGRectMake(KSCREEN_WIDTH*index, 0, self.scrollView.width, self.scrollView.height);
            [self.scrollView addSubview:contentVC.view];
            
            [_listVCQueue setObject:contentVC forKey:@(index)];
        }
    }
    

    相关文章

      网友评论

          本文标题:iOS - 将UICollectionViewCell滚动到菜单

          本文链接:https://www.haomeiwen.com/subject/ptwbfdtx.html