49

私の UICollectionView セルには、複数行テキストの UILabels が含まれています。テキストがラベルに設定されるまで、セルの高さはわかりません。

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

これは、セルのサイズを決定するために最初に検討した方法でした。ただし、これはストーリーボードからセルが作成される前に呼び出されます。

レンダリング後にコレクションをレイアウトしてセルのサイズを変更する方法はありますか?セルの実際のサイズはわかっていますか?

4

4 に答える 4

75

UICollectionViewinvalidateLayoutのプロパティで呼び出すことができるメソッドを探していると思います。.collectionViewLayoutこのメソッドはレイアウトを再生成します。これは、あなたの場合は を呼び出すことも意味します。-collectionView: layout: sizeForItemAtIndexPath:これは、目的のアイテム サイズを反映する適切な場所です。ジルネは、それらの計算方法について正しい方向性を示しています。

の使用例については、invalidateLayoutこちらを参照してください。そのメソッドについては、UICollectionViewLayout のドキュメントも参照してください。

現在のレイアウトを無効にし、レイアウトの更新をトリガーします。

討論:

このメソッドをいつでも呼び出して、レイアウト情報を更新できます。このメソッドは、コレクション ビュー自体のレイアウトを無効にし、すぐに戻ります。したがって、複数のレイアウト更新をトリガーすることなく、同じコード ブロックからこのメソッドを複数回呼び出すことができます。実際のレイアウト更新は、次のビュー レイアウト更新サイクル中に発生します。

編集:

viewDidLayoutSubviews自動レイアウト制約を含むストーリーボード コレクション ビューの場合、メソッドをオーバーライドし、このメソッドでコレクション ビュー レイアウトUIViewControllerを呼び出す必要があります。invalidateLayout

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    [yourCollectionView.collectionViewLayout invalidateLayout];
}
于 2012-12-09T11:05:47.460 に答える
5

UICollectionViewCell をサブクラス化し、layoutSubviewsこのようにオーバーライドします

これにより、セルの前縁と後縁を collectionView に固定します

override func layoutSubviews() {
        super.layoutSubviews()

        self.frame = CGRectMake(0, self.frame.origin.y, self.superview!.frame.size.width, self.frame.size.height)
    }
于 2014-09-03T09:52:52.460 に答える
4

上記のdelegateメソッド自体ではUILabel、以下のトリッキーな方法を使用してサイズを計算UICollectionViewCell sizeし、その計算に基づいて を返すことができます。

    // Calculate the expected size based on the font and 
    // linebreak mode of your label
    CGSize maximumLabelSize = CGSizeMake(9999,9999);

    CGSize expectedLabelSize = 
     [[self.dataSource objectAtIndex:indexPath.item] 
             sizeWithFont:[UIFont fontWithName:@"Arial" size:18.0f] 
        constrainedToSize:maximumLabelSize 
            lineBreakMode:NSLineBreakByWordWrapping];
于 2012-12-07T18:18:21.727 に答える