• 问题总会出现,不过解决问题的方法也会出现!!!

UICollectionView代码补充

UICollectionView 小雨 686次浏览 已收录 0个评论

UICollectionView实现无限轮播

// 当前显示图片索引 = (item - 1 + 图片数量 + 当前应该显示图片的索引) % 图片数量
// (1 - 1 + 9 + 0) % 9  = 9;
// (0 - 1 + 9 + 0) % 9  = 8;
NSInteger index = (indexPath.item - 1 + ImageCount + self.currentIndex) % ImageCount;
cell.image = self.images[index];

// 当降速完成时调用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
// 当滚到第0个cell时offset.x = 0 计算后得到 -1
// 当滚动到第2个cell时offset.x / collectionView的宽 = 2 - 1 = 1

NSInteger offset = scrollView.contentOffset.x / scrollView.bounds.size.width - 1;
// 如果滚动完之后再还是第1页的位置直接返回
if (offset == 0) {
    return;
}
// 计算当前应该显示第几张图片
// 如果向右滚时 (0 + -1 + 9) % 9 = 8 显示第8张图片;
// 如果向左滚时 (0 +  1 + 9) % 9 = 1 显示第1张图片;
NSInteger page = (self.currentIndex + offset + ImageCount) % ImageCount;
self.currentIndex = page;
// 让当前任务在主线程执行,如果主线程当前有任务,就不执行调度任务,等待前面执行完成之后再执行
dispatch_async(dispatch_get_main_queue(), ^{

    // 滚动到第一个cell
 [self scrollToFirstItem];
});
 }

自定义布局
自定义布局的重要方法

1> collectionVIew将要显示时准备布局,每当布局更新时,调用该方法做布局前的准备
- (void)prepareLayout;

2> 创建指定索引的cell的布局属性
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath;

3> 返回collectionView内所的视图的布局属性
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect;

4> 自定义布局时一定要实现此方法来返回collectionView的contentSize,内容尺寸,collectionView的滚动范围
- (CGSize)collectionViewContentSize

/** 计算cell的高 */
- (CGFloat)waterfallFlowLayout:(HMWaterfallFlowLayout *)flowLayout heightForCellWidth:(CGFloat)cellWidth indexPath:(NSIndexPath *)indexPath {
    HMShop *shop = self.shopes[indexPath.item];
    return shop.height / shop.width * cellWidth;
        }

第六节:
7.实现加载更多数据

// 当显示footerView显示时加载数据
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
// 1> 如果当前footerView没有显示或正在加载数据时直接返回
    if (self.footerView == nil || self.footerView.activityIndicator.isAnimating) {
        return;
    }
    // 2> 当offset.y + collectionView的高 > footerView的Y时开始加载数据
    if ((scrollView.contentOffset.y + scrollView.bounds.size.height) > self.footerView.frame.origin.y) {
// 让菊花转正
[self.footerView.activityIndicator startAnimating];
// 延时两秒去加载数据,模型网络
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    // 1.加载数据
    [self loadData];
    // 2.停止菊花
    [self.footerView.activityIndicator stopAnimating];
    // 3.加载完之后把属性赋为nil
    self.footerView = nil;
    // 4.刷新collectionView重新调用数据源方法和重新布局
    [self.collectionView reloadData];
});
    }
}

// 加载数据
- (void)loadData {
    // 添加数据
    [self.shopes addObjectsFromArray:[HMShop shopsWithIndex:((self.dataIndex % 3) + 1)]];
    // 让数据索引加加
    self.dataIndex++;

        }


扩展》实现横竖屏改变列数

// 当屏幕发生旋转的时候会调用此方法,
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator {
    if (size.width > size.height) {
        self.flowLayout.columensCount = 4;
    } else {
 self.flowLayout.columensCount = 2;
    }
}

tableView分割线处理技巧
UICollectionView代码补充


本博客内容既有转载自网络的内容,也有本作者原创内容,仅供学习与交流之用
如有侵权或者错误之处,请及时在下方留言!
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址