web-dev-qa-db-ja.com

UICollectionView、単純にセルを幅に合わせますか?

これは黄色のシンプルなUICollectionViewです

enter image description here

赤い矢印はセルの幅を設定します。 (TBC:ピンクのセルをクリックします。「サイズ」で「デフォルト」を選択すると、赤い矢印で設定したものがセルのサイズになります。)

たとえば、直立したiPhoneの場合、幅を320に設定します。

しかし、これは狂っているようです...確かにセル幅を設定できますICollectionViewの幅に基づいて

ビュー自体の自動サイズ変更に問題はありません。

enter image description here

それはうまくいきます。

しかし、CELLの幅を「ビューと同じ」に設定できないのはおかしいようです。コードで手動で設定する必要があるとは考えにくいですか?

TBCつまり、ニキータが指摘するように、

-(CGSize) collectionView:(UICollectionView *)collectionView
     layout:(UICollectionViewLayout *)collectionViewLayout
     sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    {
    return self.view.frame.size;
    }

(実際には、通常これも必要です...)

-(UIEdgeInsets)collectionView:(UICollectionView *)collectionView
   layout:(UICollectionViewLayout*)collectionViewLayout
   insetForSectionAtIndex:(NSInteger)section
    {
    return UIEdgeInsetsMake(0,0,0,0);   //t,l,b,r
    }

実際、コードでそれをしなければなりませんか?!ストーリーボードでは、オートレイアウトなどでそれを行う方法はありませんか?!

32
Fattie

私はあなたが見てみる必要があると思う

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

of UICollectionViewLayoutでは、向きと現在のフレームに基づいてサイズを設定できます。


実際、コードでこれを行う必要があるように思えます。

32
Nikita Took

これを行う簡単な方法があります。 Swiftコード。1つのアイテムの幅が必要で、この例ではセルの高さが64ポイントで、サイドマージンに8ポイントが必要で、最後にcollectionViewがUICollectionViewの名前であると仮定します。 。

これをviewDidLoadに挿入します。

    let layout = collectionView?.collectionViewLayout as! UICollectionViewFlowLayout
    layout.itemSize = CGSize.init(width: (UIScreen.main.bounds.width - 16), height: 64.0)

これにより、すべてのセルがデフォルトでそのサイズに設定されます。他の回答で述べたように、UICollectionViewLayoutまたはUICollectionViewFlowLayoutをサブクラス化すると、個々のセルをオーバーライドできます。しかし、単に動作のようなテーブルビューを増やしたい場合は、これでうまくいくはずです。

1
Tjp