2 つのプロトタイプ セルを持つ UICollectionView を使用しています。プロトタイプ セルは幅が異なり、含まれるコントロールも異なります (画像ビューと Web ビュー)。特定のインデックスに対して正しいプロトタイプ セルを確実に返します (すべてのセルが正しいコンテンツを表示します) が、プロトタイプ セル サイズは無視され、代わりにコレクション ビューのアイテム サイズが使用されます。手動でサイズを設定しているわけではありません。実際に表示されるときにプロパティが無視される場合、ストーリーボードでプロトタイプ セルのサイズを変更できるようにするポイントは何ですか?
9 に答える
ストーリーボード エディターのセルのサイズは、セルの設計を支援するためのものです。各プロトタイプ セルは異なるサイズになる可能性があるため、UICollectionView はすべてのセルに対してどのセルのサイズを選択すればよいかわかりません。そのため、セルに使用する実際のサイズを個別に設定します。デザイナーでコレクション ビューを選択し、[コレクション ビューのサイズ] 見出しの下の [サイズ] インスペクターでセル サイズの幅と高さを設定することで、これを行うことができます。
または、次のメソッドをオーバーライドして、各セルに使用するサイズを指定する CGSize オブジェクトを返すこともできます。この方法を使用すると、実際に各セルを異なるサイズにすることができます。
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
例:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return CGSizeMake(100, 100);
}
このメソッドを呼び出すには、View Controller が UICollectionViewDelegateFlowLayout のデリゲートである必要があります。したがって、そのデリゲート宣言をビュー コントローラーの .h ファイルに次のように追加することを忘れないでください。
@interface MyViewController () <UICollectionViewDelegateFlowLayout>
迅速
extension MyViewController : UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 100, height: 100)
}
}
同様の問題がありました。sizeForItemAt にブレークポイントを設定し、コレクションにあるすべてのセルに対して呼び出されていましたが、コードで設定されたサイズがデバイスに反映されませんでした。
私のプロジェクトの他のコレクションを見ていると、コレクション ビューのフロー レイアウトが問題のあるコレクションでわずかに異なっていることに気付きました。
ストーリーボードでフロー レイアウトを選択することによって
そして、サイズインスペクターでセルサイズと推定サイズを設定します
これは私の問題を解決するのに役立ちました。
ただし、セルのサイズは sizeForItemAt にあるものでは動的ではありません
プロパティでサイズを設定できUICollectionViewCell
ますUICollectionView
。
ストーリーボードで、 を選択Collection View
し、Document Outline
で編集Cell Size
しますSize Inspector
。
カスタムの場合は、セルのサイズ タイプをデフォルトに変更する必要があります。
UICollectionViewDelegateFlowLayout メソッドを使用してみてください。Xcode 11 以降では、Storyboard から Estimate Size を none に設定する必要があります。
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout:
UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let padding: CGFloat = 170
let collectionViewSize = advertCollectionView.frame.size.width - padding
return CGSize(width: collectionViewSize/2, height: collectionViewSize/2)
}
すべてのセルが同じサイズの場合は、UICollectionView
のセル サイズ プロパティを のサイズ プロパティと同じに設定するだけUICollectionViewCell
です。