私はカスタムUICollectionViewCellサブクラス(MyCell
)を持っています。そのインターフェイスは、自動レイアウトを使用してInterface Builderで設定されています。セルにはイメージビューとラベルがあります。自動レイアウト:UICollectionViewCellサブビューのフレームサイズを取得できません
ここで、セルを構成するとき、イメージビューの幅と高さを知る必要があります。かなり簡単ですが、不可能なようです。
私のビューコントローラでは:私の細胞サブクラスで
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];
cell.itemNumber = indexPath.item;
return cell;
}
私は、セルをカスタマイズするために、私の財産のセッターを使用しています:
- (void)setItemNumber:(NSInteger)itemNumber {
_itemNumber = itemNumber;
self.label.text = [NSString stringWithFormat:@"%i", self.itemNumber];
// In my actual project I need to know the image view's width and hight to request an image
// of the right size from a server. Sadly, the frame is always {{0, 0}, {0, 0}}
// (same for the bounds)
NSLog(@"%@", NSStringFromCGRect(self.myImageView.frame));
}
完全な例プロジェクトはhttps://github.com/kevinrenskers/CollectionViewAutoLayoutTestで見つけることができます。
これは問題です。イメージビューのサイズを知る必要があるのは、サーバーに正しいサイズのイメージを生成する必要があるためです。そして、画像表示のサイズは、{0,0} ..です
私も-layoutSubviews
方法でカスタマイズを行うことを試みた:
- (void)setItemNumber:(NSInteger)itemNumber {
_itemNumber = itemNumber;
}
- (void)layoutSubviews {
if (self.myImageView.frame.size.height) {
self.label.text = [NSString stringWithFormat:@"%i", self.itemNumber];
NSLog(@"%@", NSStringFromCGRect(self.myImageView.frame));
}
}
、これはさらに台無しです。このメソッドは2回呼び出され、まずフレームは{{0、0}、{0、0}}であり、フレームは正しく設定されます。したがって、高さをチェックするif文。スクロールを開始すると、間違ったラベルが間違ったセルに表示されます。私はここで何が起こっているのか分かりません。
example projectで試してみると、この問題はおそらくもっと意味があります。
幅と高さの制約を設定し、IBOutletを素晴らしいオプションのようにするのは残念ですが、悲しいことに、セルは固定サイズではなく、画像は縮小してセルと共に成長する必要があります。自動レイアウトの削除はオプションでもありません。最後に
を、あなたは」ラベルやimageViewを初期化しないでください。それは正しいのですか、このサンプルプロジェクトのコードを省略しましたか? – Maarten
イメージビューのサイズはどのように決まりますか? – rdelmar
私はストーリーボードを使用しています。それがimageViewとラベルを初期化しています。サイズは、上、下、左、右の制約を使用して自動レイアウトによって決定されます。 –