2015-09-15 14 views
15

UICollectionViewUIViewControllerに追加され、カスタムセルが作成されました。UICollectionViewCellのコンテンツの最初の読み込み時のサイズが正しくない

sizeForItemAtIndexPathメソッドを使用してセルのサイズを設定し、各セルを高さと幅の両方でUIScreen.mainScreen().bounds.width/2に設定しました。したがって、本質的に、各セルは画面幅の半分で、同じ長さの高さです。

次に、セル内にUIImageViewがあり、各エッジがセルの相対端に固定され、イメージビューがセルを塗りつぶすようになります。私はまた、セル内に垂直方向と水平方向の両方に中心があるUILabelを持っています。

最初の読み込みでは、セルは正しいサイズですが、内容は左上の小さな正方形ではるかに小さくなります。 (下の画像では、セルのcontentViewの背景色を緑に、imageViewの背景色を赤に設定しています)。

enter image description here

は、その後少し下にスクロールした後の細胞のすべてが細かい(とバックアップにスクロールした後、細かいまま)(と私は、再利用可能なセルがデキューされていると仮定します)。コンテンツが最初のロード時に正しく制約されないように引き起こしている何

enter image description here

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 
} 
+0

Show 'UIViewController' – Arsen

+0

' UIViewController'のコードを表示することを意味していますか? – myles

+0

はい、コードを表示 – Arsen

答えて

38

それはまだ、セル自体がすでに適切なサイズを取得しながら、それはcontentViewため100x100pxの基本的なサイズだ保持のように見えます。あなたは、セルを返す直前に次の行を追加してリセットするためにレイアウトを強制することができます。

cell?.layoutIfNeeded() 
+1

素晴らしい返事、あなたは私の一日を救った! – Himanshu

+0

最後に私はこの関数を使用し、期待通りに機能しました。ありがとう! –

+1

** layoutIfNeeded()**を呼び出さない限り、セルまたはビューが初めて読み込まれるときに発生する可能性のあるサイズ関連の問題を解決するには、** layoutIfNeeded()**を使用します。**次の描画サイクルが適用されるまで待機しますサイズ関連の変更は** layoutIfNeeded()**を呼び出すとすぐにそれらの変更が適用されます。リトルコード、より大きな効果! –

0

私はかつて同様の問題があった(私のセルの内容も正しい自動レイアウトと嵌合セルではなかったです)。このバグは、Cellクラスにあったオーバーライドされた関数layoutSubviews()で super.layoutSubviews()を呼び出していないことが原因です。

関連する問題