1

私は基本的に私が望むことを行うUICollectionViewFlowLayoutを持っています.1つのことを除いて-水平にスクロールし、ページングを有効にしたときのUICollectionViewCellsの正しい配置です。

私が基本的に欲しいのはこれです-複数のページをページごとにスクロールします:

ここで1を参照してください: UICollectionView Pictures

私の問題は、常にこの同じレイアウトで複数のセクションがあることですが、右にスクロールすると空になり(背景色のみ)、最初のページに戻ると(上のページのように)、奇妙な結果:

上のリンクの 2. を参照してください。

どうやらインデックス パスが何らかの形で混同されているようです。その理由は本当にわかりません。

この例では、私の collectionView:numberOfItemsInSection: メソッドは常に「5」を返し、私の numberOfSectionsInCollectionView: は「2」を返します。私はこれで UICollectionViewFlowLayout をサブクラス化しました:

static CGRect elementLayout[] = {

    {20, 20, 649.333333, 294},
    {20, 334, 314.666666, 294},
    {688, 20.0, 314.666666, 294},
    {354.666666, 334, 314.666666, 294},
    {688, 334, 314.666666, 294},
};

-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {  

    NSArray *attributes = [super layoutAttributesForElementsInRect:rect];
    NSMutableArray *newAttributes = [NSMutableArray array];

    for(int i = 0; i < [attributes count]; i++) 
    {
        UICollectionViewLayoutAttributes* attrs = attributes[i];
        attrs.frame = elementLayout[i];
        [newAttributes addObject:attrs];    
    }
    return newAttributes;
}

しかし、サブクラス化せず、UICollectionViewFlowLayout からの標準のデリゲート呼び出しで作成しようとすると、次のようになります。

上のリンクの 3. を参照してください。

これは正しく右にスクロールしますが、レイアウトが間違っています。私が期待したのは、NSIndexPath [0, 1] を持つセルが「大きな」セルの下ではなく右側にあることです。しかし、それでも、NSIndexPath [0, 1] のセルを図のように配置する必要があります。

ここで何か不足していますか?

4

1 に答える 1

0

たくさんのトラブルの後、私は最終的に、なぜレイアウトが奇妙に振る舞うのかを理解しました。

  • 複数のセクションがある場合は、すべてのアイテムのx原点をビュー幅の倍数だけ変更する必要があります。

  • さらに興味深い:UICollectionViewFlowLayoutが生成するセルが予想より少ない場合は、UICollectionViewLayoutAttributesのindexPathをオーバーライドして、予想されるレイアウトに一致させることができます。

したがって、作業構成は次のようになります。

for(int i = 0; i < (countOfCellsAnticipated); i++) 
{
    UICollectionViewLayoutAttributes* attrs = attributes[i];

    NSIndexPath* anticipatedIndexPath = [NSIndexPath indexPathForItem:i
                                                            inSection:sectionIndex];

    attrs.indexPath = anticipatedIndexPath;
    attrs.frame = recalculatedFrameInAbsoluteViewCoordinates;
    [newAttributes addObject:attrs];    
}

return newAttributes;
于 2012-12-09T12:23:40.407 に答える