iOS UICollectionView 在滚动时停在某个item位置上
作者:互联网
方法一:实现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