2013-07-31 17 views
5

私はカスタム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を素晴らしいオプションのようにするのは残念ですが、悲しいことに、セルは固定サイズではなく、画像は縮小してセルと共に成長する必要があります。自動レイアウトの削除はオプションでもありません。最後に

+0

を、あなたは」ラベルやimageViewを初期化しないでください。それは正しいのですか、このサンプルプロジェクトのコードを省略しましたか? – Maarten

+0

イメージビューのサイズはどのように決まりますか? – rdelmar

+0

私はストーリーボードを使用しています。それがimageViewとラベルを初期化しています。サイズは、上、下、左、右の制約を使用して自動レイアウトによって決定されます。 –

答えて

1

私は、(スーパーの)ImageViewの上、右、下、左間隔の制約、トップを追加し、それらにIBOutletsを追加して、このようなものを使用:あなたのコードから判断する

CGFloat height = self.contentView.bounds.size.height - self.topConstraint.constant - self.bottomConstraint.constant; 
CGFloat width = self.contentView.bounds.size.width - self.leftConstraint.constant - self.rightConstraint.constant; 
関連する問題