11

私が正しく理解している場合、UICollectionViewCellの内容はcontentViewプロパティの中に入り、背景はbackgroundViewに入るはずです。nibでUICollectionViewCellを定義する

ただし、UICollectionViewCellをInterface Builderにドラッグすると、contentViewまたはbackgroundViewという言及はありません。サブビューを追加すると、セル全体が親として表示され、contentViewまたはbackgroundViewではなくなります。

UICollectionViewCellをIBで定義する正しい方法は何ですか?

答えて

14

これは真実ではありません

「私はサブビューを追加する場合、それらはcontentViewない、親としての全細胞を持っています」。 UICollectionViewCellをドラッグしてUI要素を追加すると、コンテンツビューに追加されます。それがオブジェクトリストに表示されないという事実は、そこにないことを意味するものではありません(NSBoxの場合も同じですが、IBにも表示されないコンテンツビューもあります)。 collectionView:didSelectItemAtIndexPath:の場合、cellForItemAtIndexPathをログに記録し、そのサブビューを見ると、1つしか見つからず、cell.contentViewを記録して取得したものと同じものになります。サブビューをログに記録すると、UI要素が表示されます。

今、バックグラウンドビューまでは、IBからアクセスできるものではないと思います。 UIViewでxibファイルを作成し、それをセルのbackgroundViewプロパティに割り当てることができます。

+2

ハーフ・トゥルー。私はこれを前に試してみましたが、うまくいきませんでした。しかし、私はUIViewをドラッグし、UICollectionViewCellサブクラスに型を変更しました。これは、あなたが言ったことを正確に行う場合にのみ機能します:ライブラリからUIColllectionViewCellをドラッグし、タイプを変更します。非常にハッキー。 – hpique

+1

@hpique、それをサブクラス化する前に、正しいタイプのオブジェクトで始める必要があります。UICollectionViewCellで始めると、UIViewで取得できないデフォルトのプロパティとデータがすべて取得されます。これについては何の問題もありません。 – rdelmar

+0

'contentView'が暗黙的なので、悪いです。私はそれを見ることができないので、試行錯誤することなく、あるタイプまたは他のタイプから始めることが違いを生むことは分かりませんでした。 – hpique

7

より良いオプションがないため、contentViewbackgroundViewに別々のnibファイルを使用しています。その後、私のUICollectionViewCellサブクラスで:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     NSArray *contentViewNib = [[NSBundle mainBundle] loadNibNamed:@"CollectionViewCellContentView" owner:self options:nil]; 
     [self.contentView addSubview:contentViewNib[0]]; 
     NSArray *backgroundViewNib = [[NSBundle mainBundle] loadNibNamed:@"CollectionViewCellBackgroundView" owner:self options:nil]; 
     self.backgroundView = backgroundViewNib[0]; 
    } 
    return self; 
} 
+0

あなたのクラスをコレクションビューに登録して、セルクラスのinitWithFrameにxibsをロードするだけですか? – topwik

+0

あなたはコードを使ってxibに設定したアウトレットにアクセスできますか? – topwik

+1

このようにして、今まで私が知る限り、それらのxibの内容を変更する予定がない場合にのみ有効です。それらのxibのセルごとに変化する動的コンテンツ、ラベル、またはテキストフィールドはありませんか? – topwik

0

これはXcode 8の新機能であるかどうかは分かりませんが、UICollectionViewCellにはbackgroundViewselectedBackgroundViewを接続するコンセントが含まれています。

enter image description here

これのおかげで、あなたはあなたのコレクションビューのセルにUIView(またはサブクラス)を追加し、コンセントの1のいずれかに接続することができます。この方法で、IBを使用して定義することができます。

enter image description here

は、この情報がお役に立てば幸い!

関連する問題