ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

iOS UICollectionView 在滚动时停在某个item位置上

2019-03-16 09:44:48  阅读:529  来源: 互联网

标签:count return collectionView self iOS item currentIndexPath UICollectionView void


方法一:实现UIScrollView的代理,然后实现下面这个方法

#pragma mark - UIScrollViewDelegate
//预计出大概位置,经过精确定位获得准备位置
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
CGPoint targetOffset = [self nearestTargetOffsetForOffset:*targetContentOffset];
targetContentOffset->x = targetOffset.x;
targetContentOffset->y = targetOffset.y;
}
//计算落在哪个item上
- (CGPoint)nearestTargetOffsetForOffset:(CGPoint)offset
{
CGFloat pageSize = itemSpacing + itemWidth;
//四舍五入
NSInteger page = roundf(offset.x / pageSize);
CGFloat targetX = pageSize * page;
return CGPointMake(targetX, offset.y);
}

方法二:重写UICollectionViewFlowLayout

参考文献:http://tech.glowing.com/cn/practice-in-uiscrollview/
---------------------
作者:C_calary
来源:CSDN
原文:https://blog.csdn.net/C_calary/article/details/78891724
版权声明:本文为博主原创文章,转载请附上博文链接!

 

 

 

UICollectionView横向移动时,且UICollectionView.page = yes只显示一个Cell 移动时姑且计算划至第几个cell

#pragma mark - collectionView

- (UICollectionView *)collectionView

{

    if (!_collectionView) {

        

        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];

        layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;

        _collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, screenHeight - kTopHeight - Height_BottomView) collectionViewLayout:layout];

        

        _collectionView.dataSource = self;

        _collectionView.delegate = self;

        _collectionView.pagingEnabled = YES;

        

//        _collectionView.scrollEnabled = !GetAnswernextque; // 如果只能滑动至下一题取消滚动效果

        [_collectionView registerClass:[AnswerCollectionViewCell class] forCellWithReuseIdentifier:@"AnswerCollectionViewCell"];

        

        _collectionView.backgroundColor = [UIColor whiteColor];

        _collectionView.showsVerticalScrollIndicator = NO;

        _collectionView.showsHorizontalScrollIndicator = NO;

        

        [self.view addSubview:_collectionView];

    }

    return _collectionView;

}

 

#pragma mark - UICollectionViewDelegate

//预计出大概位置,经过精确定位获得准备位置

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{

    CGPoint targetOffset = [self nearestTargetOffsetForOffset:*targetContentOffset];

    targetContentOffset->x = targetOffset.x;

    targetContentOffset->y = targetOffset.y;

//    self.currentIndexPath

    NSInteger index = targetOffset.x/screenWidth;

    DLog(@"---------%ld",index);

    self.currentIndexPath = [NSIndexPath indexPathForItem:index inSection:0];

    self.lbPageIndex.text = [NSString stringWithFormat:@"%li/%li",self.currentIndexPath.item,self.dataSource.count];

}

//计算落在哪个item上

- (CGPoint)nearestTargetOffsetForOffset:(CGPoint)offset

{

    CGFloat pageSize = screenWidth;

    //四舍五入

    NSInteger page = roundf(offset.x / pageSize);

    CGFloat targetX = pageSize * page;

    return CGPointMake(targetX, offset.y);

}

 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    if (self.collectionView.visibleCells.count == 1) {

        if ([self.collectionView.visibleCells.firstObject isKindOfClass:[AnswerCollectionViewCell class]]) {

            self.currentIndexPath = [self.collectionView indexPathForCell:self.collectionView.visibleCells.firstObject];

            self.lbPageIndex.text = [NSString stringWithFormat:@"%li/%li",self.currentIndexPath.item,self.dataSource.count];

        }

    }

}

 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    

    if (self.collectionView.visibleCells.count == 1) {

        if ([self.collectionView.visibleCells.firstObject isKindOfClass:[AnswerCollectionViewCell class]]) {

            self.currentIndexPath = [self.collectionView indexPathForCell:self.collectionView.visibleCells.firstObject];

            self.lbPageIndex.text = [NSString stringWithFormat:@"%li/%li",self.currentIndexPath.item,self.dataSource.count];

        }

    }

}

 

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {

    

    self.lbPageIndex.text = [NSString stringWithFormat:@"%li/%li",self.currentIndexPath.item,self.dataSource.count];

}

 

 

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {

    [self.view endEditing:YES];

    

//    if ([[YJ_GCDTimerManager sharedInstance] existTimer:Answerquetime]) {

//        [[YJ_GCDTimerManager sharedInstance] cancelTimerWithName:Answerquetime];

//    }

}

 

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {

//    if (self.model) {

//        return self.model.categoryQuestionList.count;

//    }

//

//    if (self.scoreModel) {

//        return self.scoreModel.categoryQuestionList.count;

//    }

    return 1;

}

 

/* 个数 **/

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

{

//    CategoryQuestionListModel *CQLM = nil;

//

//    if (self.model) {

//        CQLM = self.model.categoryQuestionList[section];

//    }

//

//    if (self.scoreModel) {

//        CQLM = self.scoreModel.categoryQuestionList[section];

//    }

//

//    if (CQLM) {

//        return  CQLM.questionList.count;

//    }

    return self.dataSource.count;

}

 

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {

    return 0;

}

 

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {

    return 0;

}

 

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

    return collectionView.frame.size;

}

 

/* cell设置 **/

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

{

    AnswerCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"AnswerCollectionViewCell" forIndexPath:indexPath];

//    CategoryQuestionListModel *CQLM = nil;

//

//    if (self.model) {

//        CQLM = self.model.categoryQuestionList[indexPath.section];

//    }

//

//    if (self.scoreModel) {

//        CQLM = self.scoreModel.categoryQuestionList[indexPath.section];

//    }

//

//    if (CQLM) {

//        cell.model= CQLM.questionList[indexPath.row];

//    }

    cell.delegate = self;

    QuestionListModel *model = self.dataSource[indexPath.row];

    model.status = self.listModel.status;

    cell.listModel = self.dataSource[indexPath.row];

    cell.backgroundColor = [UIColor whiteColor];

    

    return cell;

}

 

 

//- (void)leftAction:(UISwipeGestureRecognizer *)sender {

//    [self nextQuestion];

//}

 

// 下一题

- (void)nextQuestion {

    

//    if (self.currentIndexPath == nil) {

//        self.currentIndexPath = [NSIndexPath indexPathForItem:0 inSection:0 ];

//    }

//

    

    if (self.currentIndexPath.item + 1 >= [self.collectionView numberOfItemsInSection:self.currentIndexPath.section]) { // 某组的最后一个

 

//        if (self.dataSource.count - 1 > self.currentIndexPath.section) { // 判断是不是最后一组

//            self.currentIndexPath = [NSIndexPath indexPathForItem:0 inSection:self.currentIndexPath.section + 1];

//        } else {

//            // 在这里要交卷

//            NSLog(@"最后一题答题时间到了,交卷");

//            [self endTimer];

//            return;

//        }

    } else {

        self.currentIndexPath = [NSIndexPath indexPathForItem:self.currentIndexPath.row + 1 inSection:self.currentIndexPath.section];

    }

//

    [self.collectionView scrollToItemAtIndexPath:self.currentIndexPath atScrollPosition:UICollectionViewScrollPositionRight animated:YES];

}

 

#pragma mark - 定时器

 

- (void)setTotalTime:(NSInteger)totalTime {

    _totalTime = totalTime;

    //通知主线程刷新

    dispatch_async(dispatch_get_main_queue(), ^{

        //回调或者说是通知主线程刷新,

        self.navigationItem.title = [self handleTime:totalTime];

    });

    

}

 

- (NSString *)handleTime:(NSInteger)time {

    if (time <= 0) {

        return @"00:00";

    }

    //    NSLog(@"%@",[NSString stringWithFormat:@"%02ld:%02ld",time/60,time%60]);

    return [NSString stringWithFormat:@"倒计时%02ld分%02ld秒",time/60,time%60];

}

 

//- (void)requestData {

//

//    NSString *path = [[NSBundle mainBundle] pathForResource:@"成绩报告.json" ofType:nil];

//    NSData *data = [NSData dataWithContentsOfFile:path];

//    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

//    self.scoreModel =  [ScoreReportModel mj_objectWithKeyValues:dict];

//    SetISAnsweKey(NO)

//

//    [self.collectionView reloadData];

//}

 

- (void)startTimer {

    __weak typeof(self) weakSelf = self;

    [[YJ_GCDTimerManager sharedInstance] scheduledDispatchTimerWithName:NSStringFromClass([HDAnswerViewController class]) timeInterval:1.f queue:nil repeats:YES actionOption:(YJ_ActionOptionAbandonPrevious) action:^{

        //        NSLog(@"======%ld",weakSelf.totalTime);

        weakSelf.totalTime -= 1;

        if (weakSelf.totalTime <= 0) {

            [weakSelf endTimer];

        }

    }];

}

 

 

- (void)endTimer {

    

    NSLog(@"到时间了交卷");

    [self assignment];

    

    [[YJ_GCDTimerManager sharedInstance] cancelTimerWithName:NSStringFromClass([HDAnswerViewController class])];

    [self leftAction];

}

/**

 交卷

 */

- (void)assignment {

    

}

#pragma mark - FlipPageDelegate

- (void)flipToNextPage{

    CGPoint offsetPoint = self.collectionView.contentOffset;

    NSInteger pageIndex = offsetPoint.x / screenWidth;

    if (pageIndex < self.dataSource.count - 1) {

        pageIndex++;

        NSIndexPath *curIndexPath = [NSIndexPath indexPathForItem:pageIndex inSection:0];

        self.currentIndexPath = curIndexPath;

//        self.lbPageIndex.text = [NSString stringWithFormat:@"%li/%li",pageIndex,self.dataSource.count];

        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:pageIndex inSection:0];

        [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:YES];

    }else{

        [ToolUtils showError:@"已经是最后一页"];

    }

}

标签:count,return,collectionView,self,iOS,item,currentIndexPath,UICollectionView,void
来源: https://www.cnblogs.com/sundaysgarden/p/10540677.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有