【问题标题】:UICollectionView Horizontal Scrolling shows previous items even when paging is enabled即使启用分页,UICollectionView 水平滚动也会显示以前的项目
【发布时间】:2012-11-14 14:49:13
【问题描述】:

我正在实现一个滚动方向设置为水平的 uicollection 视图。我还在情节提要中启用了分页选项。在我看来,我一次可以显示 4 个项目。如果我有 5 个项目,第一页有 4 个项目,但第二页有 3 个项目。以前的项目也显示在第二页上。

我只想问如何防止这种情况发生?我想要第一页上的 4 个项目,第二页上只有 1 个项目。我正在考虑添加项目并将它们设置为隐藏来执行此操作。这是解决这个问题的正确方法吗?

非常感谢!

【问题讨论】:

  • 你能解决这个问题吗?我似乎有同样的问题。我总共有 4 个项目,每个页面应该包含三个项目。第一个页面被正确创建,但第二个页面的宽度显然只与第 4 项一样宽,因此它实际上似乎从未分页到第二页......第二个“页面”包含第 2、第 3 和第 4 项它会弹回来。相反,会期望它在第二页上只有一项。任何帮助将不胜感激!

标签: ios uicollectionview


【解决方案1】:

也许您可以将 UICollectionView 的contentSize 属性设置为其bounds 的下一个倍数?

例如对于单节集合视图:

NSUInteger itemsPerPage = 4;
NSUInteger pageCount = (NSUInteger) ceilf((float)[collectionView.dataSource numberOfItemsInSection:0] / itemsPerPage);
CGFloat contentWidth = collectionView.bounds.size.width * pageCount;
collectionView.contentSize = CGSizeMake(contentWidth, collectionView.contentSize.height);

【讨论】:

  • 这应该在什么时候完成?我在 viewWillAppear 和 viewDidAppear 中尝试过,但没有成功。只是想知道这是否有一个好地方。
【解决方案2】:

我遇到了类似的问题,我以一种相当老套的方式解决了它,但它确实有效,我现在对此很满意。

基本上我决定做的是用空的 UICollectionViewCells 填充集合视图页面。

我首先计算总共有多少项。如果我的 NSFetchedResultsController 提供的项目总数不是三的倍数,那么我添加必要的项目数,使总数是三的倍数。

例如,如果我得到四个类别,我需要再添加两个以使其总共六个:

#define ITEMS_PER_PAGE 3

//...

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    NSArray *sections = [categoriesFetchedResultsController sections];
    id <NSFetchedResultsSectionInfo> sectionInfo = sections[section];

    NSInteger categoryCount = [sectionInfo numberOfObjects];
    NSInteger extraItemsNeeded = ITEMS_PER_PAGE - (categoryCount % ITEMS_PER_PAGE);
    NSInteger totalItems = categoryCount + extraItemsNeeded;

    NSInteger pages = (NSInteger)(totalItems / ITEMS_PER_PAGE);
    self.pageControl.numberOfPages = pages;
    return totalItems;
}

然后当需要生成单元格时,我会执行以下操作:

    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
        CategoryCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CategoryCell" forIndexPath:indexPath];
        // use a generic UICollectionCell for the "empty cell" case.        
        UICollectionViewCell *emptyCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"EmptyCell" forIndexPath:indexPath];

        if (indexPath.row < [[categoriesFetchedResultsController fetchedObjects] count] ) {
            NSManagedObject *object = [categoriesFetchedResultsController objectAtIndexPath:indexPath];
            NSData *imageData = [object valueForKey:@"thumbnail_data"];
            NSString *name = [object valueForKey:@"category_name"];

            cell.image.image = [UIImage imageWithData:imageData];
            cell.label.text = name;
            return cell;
        }

        return emptyCell;
    }

我希望这对将来的某个人有所帮助,因为解决这个问题并不像应有的那么简单,而且我很惊讶流布局并没有自动适当地计算页面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多