2017-02-14 22 views
2

3行2列のレイアウトが必要な6つの要素を持つコレクションビューがあります。 viewDidLoadでSwift:コレクションビューがサイズの変更に正しく調整されていません

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
    let totalWidth = collectionView.bounds.size.width - 12 
    let totalHeight = collectionView.bounds.size.height - 18 
    let heightOfView = (totalHeight/3) 
    let dimensions = CGFloat(Int(totalWidth)) 

     return CGSize(width: dimensions/2, height: heightOfView) 
} 

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return 6 
} 

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { 
    return UIEdgeInsetsMake(0, 5, 0, 5) 
} 

::これは完璧である。このようになりますコレクションビューを生成

override func viewDidLoad() { 
    super.viewDidLoad() 
    collectionView.dataSource = self 
    collectionView.delegate = self 

    flowLayout.scrollDirection = .horizontal 
    flowLayout.minimumLineSpacing = 5 
    flowLayout.minimumInteritemSpacing = 5 

:私はこれを達成するために、次のコードを使用し

This is the desired output

しかしときビューがロードされる前に、私は状況に応じてコレクションビューの下のビューを非表示にして、サイズを調整します(高さが50ptになります)。状況的viewWillAppearのビューを非表示にする

Collection view appearance when adjusted to account for hidden view

:、わずか2行の代わりに、3列の間に大きなギャップにスクロールしない限り、画面オフ細胞を(画像を参照)は、以下の4 & 5に変更utput testVariableが真であり、それがある場合bottomViewを隠し、スペースを埋めるためにcollectionView 50 PTS大きな行う場合

override func viewWillAppear(_ animated: Bool) { 

    if testVariable == true { 
     bottomView.isHidden = true 
     // make bottomView height = 0 
     bottomViewHeight.constant = 0 
     // make collectionView space to the bottom of the view controller 0 
     collectionToBase.constant = 0 
     view.layoutIfNeeded() 
    } 
} 

このコードをテスト:私は、次を追加しました。私は、このコードをviewWillAppearに追加しました。これは、collectionViewLayoutが追加の50ptの高さを考慮し、それに応じて調整されることを期待していましたが、それはありません。

+0

お試しください。セルの高さを小さくして作成してください。 –

答えて

2

レイアウトを無効にする必要があります。それ自体ではありません。 layoutIfNeeded()を呼び出した後、フローレイアウトでinvalidateLayout()を呼び出します。

flowLayout.invalidateLayout() 
+0

どうもありがとうございました。良い一日を過ごしてください! –

+0

あなたは大歓迎です。私はこの問題を巡って取り組んだ。私はラウンドラウンドとラウンドを行った。私はそれが火と忘れて欲しいと思った。そうではありません。 –

関連する問題