如何设置 UICollectionViewCell 的位置?

Posted

技术标签:

【中文标题】如何设置 UICollectionViewCell 的位置?【英文标题】:How do I set the position of a UICollectionViewCell? 【发布时间】:2013-07-31 00:22:47 【问题描述】:

据我所知,“协议方法”:

(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 

自动设置我创建的单元格的边界。对于我的UICollectionViewCells 来说,这一切都很好,但我需要其中一个在我指定的位置。任何正确方向的指针将不胜感激。

【问题讨论】:

【参考方案1】:

我可以假设您还使用UICollectionViewFlowLayout 的实例作为您的集合视图的布局对象吗?

如果是这样,快速而肮脏的答案是继承 UICollectionViewFlowLayout 并覆盖 -layoutAttributesForItemAtIndexPath: 方法:

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath

    if (indexPath.section == 0 && indexPath.item == 2) // or whatever specific item you're trying to override
    
        UICollectionViewLayoutAttributes *layoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
        layoutAttributes.frame = CGRectMake(0,0,100,100); // or whatever...
        return layoutAttributes;
    
    else
    
        return [super layoutAttributesForItemAtIndexPath:indexPath];
    

您可能还需要覆盖-layoutAttributesForElementsInRect:

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect

    NSArray *layoutAttributes = [super layoutAttributesForElementInRect:rect];
    if (CGRectContainsRect(rect, CGRectMake(0, 0, 100, 100))) // replace this CGRectMake with the custom frame of your cell...
    
        UICollectionViewLayoutAttributes *layoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
        layoutAttributes.frame = CGRectMake(0,0,100,100); // or whatever...
        return [layoutAttributes arrayByAddingObject:layoutAttributes];
    
    else
    
        return layoutAttributes;
    

然后在创建集合视图时使用新的子类代替 UICollectionViewFlowLayout

【讨论】:

好的,谢谢!我已经在使用名为lxreorderablecollectionviewflowlayout 的 UICollectionViewFlowLayout 的子类,但我只是使用其中的现有代码以及您提供的东西并让它工作。 在layoutAttributesForElementsInRect方法NSArray *layoutAttributes = [super layoutAttributesForElementInRect:rect];应该替换为 NSArray *layoutAttributes = [super layoutAttributesForElementsInRect rect]; @JoshHinman 你能解释一下 layoutAttributesForElementsInRect 的作用以及为什么它也必须被覆盖 indexPath 在 layoutAttributesForElementsInRect 中不存在

以上是关于如何设置 UICollectionViewCell 的位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UICollectionViewCell 上设置 UILabel?

如何设置动态宽度 UICollectionViewCell

如何设置 UICollectionViewCell 大小

如何设置 UICollectionViewCell 的内容

如何将 UICollectionViewCell 高度设置为视图(屏幕)高度的 90%?

Swift:如何将自定义 UICollectionViewCell 设置为圆形?