4

各セルの画像ビューの高さに応じて動的な高さを持つ UICollectionView セルを作成する必要があります。次のように、目的の動作を実装するために UICollectionViewFlowLayout からサブクラスを作成しました。

#define numColumns 2

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

    NSArray* attributesToReturn = [super layoutAttributesForElementsInRect:rect];

    for (UICollectionViewLayoutAttributes* attributes in attributesToReturn) {

        if (attributes.representedElementKind == nil) {

            NSIndexPath* indexPath = attributes.indexPath;
            attributes.frame = [self layoutAttributesForItemAtIndexPath:indexPath].frame;

        }

    }

   return attributesToReturn;

}

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

    UICollectionViewLayoutAttributes* currentItemAttributes = [super layoutAttributesForItemAtIndexPath:indexPath];

    if (indexPath.item < numColumns) {

        CGRect frame = currentItemAttributes.frame;
        frame.origin.y = 5;
        currentItemAttributes.frame = frame;

        return currentItemAttributes;

    }

    NSIndexPath* indexPathPrev = [NSIndexPath indexPathForItem:indexPath.item-numColumns inSection:indexPath.section];
    CGRect framePrev = [self layoutAttributesForItemAtIndexPath:indexPathPrev].frame;
    CGFloat YPointNew = framePrev.origin.y + framePrev.size.height + 10;
    CGRect frame = currentItemAttributes.frame;
    frame.origin.y = YPointNew;
    currentItemAttributes.frame = frame;

    return currentItemAttributes;

}

そして、コレクション ビュー コントローラー デリゲート フロー レイアウトで

 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

    float imageHeight = [[(Product *)self.products[indexPath.row] image] height];
    float imageWidth = [[(Product *)self.products[indexPath.row] image] width];

    float ratio = 150.0/imageWidth;

    return CGSizeMake(150, ratio*imageHeight);

}

セルの実装

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

    ProductCell *cell = (ProductCell *)[self.collectionView dequeueReusableCellWithReuseIdentifier:@"ProductCell" forIndexPath:indexPath];

    ....

    [cell.imageView setImageWithURL:[NSURL URLWithString:[[(Product *)self.products[indexPath.row] image] url]]];

    return cell;

}

すべてのセルが期待どおりに表示されましたが、コンテンツ ビューが長すぎました。

動的 UICollectionView の高さ

-(CGSize)collectionViewContentSize メソッドを実装して正しい contentSize を取得する必要があると思いますが、コレクション ビューの実際の高さを計算する方法がわかりません。

4

0 に答える 0