繁体   English   中英

即使启用了分页,UICollectionView Horizo​​ntal Scrolling也会显示以前的项目

[英]UICollectionView Horizontal Scrolling shows previous items even when paging is enabled

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

我想问一下如何防止这种情况? 我想在第一页上有4个项目,在第二页上只有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);

我遇到了类似的问题,我以一种相当hack的感觉解决了它,但它确实有效,而且我现在对此感到满意。

基本上我决定用空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;
    }

我希望这对未来的某个人有所帮助,因为解决这个问题并不像应该的那样简单,我很惊讶流程布局不仅仅是自动计算页面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM