5

カスタム UICollectionViewCell サブクラス ( MyCell) があり、そのインターフェイスは、自動レイアウトを使用して Interface Builder でセットアップされます。セルには画像ビューとラベルがあります。

ここで、セルを構成するときに、画像ビューの幅と高さを知る必要があります。かなり単純に聞こえますが、それは不可能のようです。

私のビューコントローラで:

- (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 ステートメント。ただし、スクロールを開始すると、間違ったセルに間違ったラベルが表示されます。ここで何が起こっているのかわかりません。

この問題は、サンプル プロジェクトで試してみると、おそらくより理にかなっています。

幅と高さの制約を設定して IBOutlets を作成するのは素晴らしいオプションのように思えますが、残念ながらセルには固定サイズがなく、画像はセルに合わせて縮小および拡大する必要があります。自動レイアウトを削除することもできません。

4

1 に答える 1

1

最後に、イメージビュー (スーパービュー) に上、右、下、左の間隔の制約を追加し、それらに 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;
于 2013-08-06T12:03:09.460 に答える