UICollectionView
にUIViewController
を追加し、そのためのカスタムセルを作成しました。
sizeForItemAtIndexPath
メソッドを使用してセルのサイズを設定し、各セルを高さと幅の両方でUIScreen.mainScreen().bounds.width/2
に設定します。したがって、基本的に、各セルは画面の半分の幅で、これと同じ高さです。
次に、セル内にUIImageView
があり、各エッジがセルの相対エッジに固定されているため、画像ビューがセルを埋めます。また、セルの垂直方向と水平方向の両方に中央に配置されるUILabel
もあります。
ただし、最初のロードでは、セルは正しいサイズですが、コンテンツは左上の小さな正方形ではるかに小さくなります。 (以下の画像に見られるように、セルのcontentView背景色を緑に設定し、imageView背景色を赤に設定しました)。
次に、少し下にスクロールした後(再利用可能なセルがキューから取り出されると仮定します)、すべてのセルが正常です(上にスクロールしても元のままです)。
最初の読み込み時にコンテンツが適切に制約されない原因は何ですか?
[〜#〜] update [〜#〜]
私のUIViewController
のコードの一部:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
var cell = collectionView.dequeueReusableCellWithReuseIdentifier("PrevDrawCell", forIndexPath: indexPath) as? PrevDrawCell
if cell == nil {
cell = PrevDrawCell()
}
cell!.drawVC = self
cell!.imageShortCode = self.tempImageURLs[indexPath.row]
// Pull image (async) and set after download
cell!.setupImage()
cell!.contentView.backgroundColor = UIColor.greenColor()
cell!.coverView.backgroundColor = UIColor.redColor()
cell!.dateLabel.font = UIFont(name: "HelveticaNeue-Light", size: 26)
cell!.dateLabel.text = "\(self.tempImageURLs.count-indexPath.row)/9"
return cell!
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
let size = UIScreen.mainScreen().bounds.width/2
return CGSize(width: size, height: size)
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets {
return UIEdgeInsetsZero
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {
return 0
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {
return 0
}
ContentViewの基本サイズである100x100pxを保持しているように見えますが、セル自体は既に適切なサイズになっています。セルを返す直前に、次の行を追加してレイアウトを強制的にリセットできます。
cell?.layoutIfNeeded()
私はかつて同様の問題を抱えていました(正しいオートレイアウトを使用しても、セルの内容がセルに適合しませんでした)。このバグは、Cellのクラスにあるオーバーライドされた関数layoutSubviews()でsuper.layoutSubviews()
を呼び出さないことが原因でした。
Storyboard + AutoLayoutを使用し、実行時にアクティブにする制約を選択する場合:
DequeueReusableCellを使用する場合、最初のロード時にセルは作成されますが、ビューは初期化されていないため、制約の変更は保存されません-Storyboardで設定したものが使用されます。私にとっての解決策は、ビューがロードされた後に制約を更新することでした:
override func layoutSubviews() {
super.layoutSubviews()
adjustIconWidths()
}