【问题标题】:UICollectoinView horizontal scroll with inter item spacingUIColletoinView 水平滚动与项目间间距
【发布时间】:2013-02-01 17:08:45
【问题描述】:

我正在为我的一些图像使用集合视图。

每个图像都应该以屏幕的大小显示,因此一个单元格具有屏幕的宽度。 flowLayout 的minimumInterItemSpacing 是 25。 所以现在的问题是,如果我滚动,集合视图不会滚动到下一个图像的开头,而是滚动到 interItemSpacing 的开头。

举个例子:

Image/Cell width = 320
CollectionView's interItemSpacing = 25

如果我滚动一页,则滚动视图内容偏移量为 320 而不是 345,这意味着第二个单元格不在屏幕中心。

如何解决这个问题?有什么建议么?

【问题讨论】:

  • 这不是一个选项,图片之间应该有空格!
  • 滚动到下一个图像并将滚动视图居中!我想我在这里找到了一个可能的重复项:stackoverflow.com/questions/13228600/…
  • cellWidth 320,collectionViewWidth 320 和 interItemSpacing = 25 是我的需要...

标签: iphone ios ipad uicollectionview


【解决方案1】:

好的,我发现有 2 个选项可以实现正确的滚动。

1. UICollectionViewController size

通过添加您需要的值作为 interItemSpacing 来增加集合视图及其项目的大小。

这里有一些代码:

- (void) setupCollectionView;
{
    PSTCollectionViewFlowLayout *flowLayout = [[PSTCollectionViewFlowLayout alloc] init];
    CGSize itemSize = self.view.bounds.size;
    itemSize.width +=25;
    [flowLayout setItemSize:itemSize];
    [flowLayout setScrollDirection:PSTCollectionViewScrollDirectionHorizontal];
    flowLayout.minimumInteritemSpacing = 0.0f;
    flowLayout.minimumLineSpacing = 0.0f;

    self.collectionView = [[PSTCollectionView alloc] initWithFrame:self.view.bounds
                                          collectionViewLayout:flowLayout];
    [self.collectionView registerClass:[AMDetailImageCell class]
        forCellWithReuseIdentifier:AMDetailImageCellIdentifier];
    self.collectionView.delegate = self;
    self.collectionView.dataSource = self;
    self.collectionView.pagingEnabled = YES;
    CGRect rectSize = self.view.bounds;
    rectSize.size.width +=25;
    self.collectionView.frame = rectSize;
    [self.view addSubview:self.collectionView];

    [self scrollToStartIndex];

}

2. SectionEdgeInset

制作一页 = 一个部分并使用 sectionEdgeInset 会产生相同的解决方案,但 - 可以肯定 - 并不总是一种选择!

【讨论】:

    【解决方案2】:

    您还应该考虑 iterItemSpacing 来提供单元格宽度。尝试提供 cellWidth= 320-25=295。它应该工作。

    【讨论】:

    • 嗯我得到了另一个解决方案,将 sectionEdgeInset 设置为我想要的并使用每页的部分。然后可能集合视图可以具有适当的大小 - 全屏
    • 我没有尝试使用 sectionEdgeInset。如果你成功了,请告诉我。
    【解决方案3】:

    我找到了一个解决方案,它涉及子类化 UICollectionViewFlowLayout。

    我的 CollectionViewCell 大小为 302 X 457,我将最小行距设置为 18(每个单元格 9pix)

    当您从该类扩展时,有一些方法需要被覆盖。其中之一是

    • (CGSize)collectionViewContentSize

    在这种方法中,我需要将 UICollectionView 中的总宽度相加。这包括 ([datasource count] * widthOfCollectionViewCell) + ([datasource count] * 18)

    这是我的自定义 UICollectionViewFlowLayout 方法......

    -(id)init
    {
        if((self = [super init])){
    
           self.itemSize = CGSizeMake(302, 457);
           self.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10);
           self.minimumInteritemSpacing = 0.0f;
           self.minimumLineSpacing = 18.0f;
           [self setScrollDirection:UICollectionViewScrollDirectionHorizontal];
       }
        return self;
    }
    
    
    
    -(CGSize)collectionViewContentSize{
       return CGSizeMake((numCellsCount * 302)+(numCellsCount * 18), 457);
    }
    

    这对我有用,所以我希望其他人觉得它有用!

    【讨论】:

    • init 在我的情况下从未被调用过。你知道为什么会发生吗?另一方面,collectionViewContentSize 被调用。
    • 这可能来晚了,但 init 永远不会被称为原因,也许,你正在使用故事板,所以实现 initWithCoder:
    猜你喜欢
    • 2015-07-04
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多