0

私の知る限り、「プロトコルメソッド」:

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

作成したセルの境界を自動的に設定します。これは私の にとってはすべて問題なくダンディーですが、UICollectionViewCellsそのうちの 1 つを指定した場所に配置する必要があります。正しい方向への指針をいただければ幸いです。

4

1 に答える 1

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次に、コレクション ビューを作成するときに、代わりに新しいサブクラスを使用します。

于 2013-07-31T00:37:06.627 に答える