2015-12-16 21 views
5

UICollectionViewのセルの高さを、コレクションビューの高さと同じにするにはどうすればよいですか?次のコードは、コレクションビューの高さが現時点ではわからないため、自動レイアウトがこの段階でプロパティを使いこなしているように見えるため、機能しません。セルの高さが実際のコレクションビューより高くなります。UICollectionViewCellとUICollectionViewの等高さ

私はこれを解決する答えに賞金300を追加します!

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 

     return CGSize(width: 100, height: collectionView.frame.size.height) 
    } 

2015年12月16日18:43:53.643マイアプリ[1055:434762]ので コードhereUICollectionViewFlowLayoutが定義されていない入力の挙動:2015年12月16日 18: 43:53.643 My-app [1055:434762]アイテムの高さは、UICollectionViewの高さからセクションのインセットの上端と下端を差し引いた値からコンテンツの上下の値を差し引いた値よりも小さくする必要があります。 2015-12-16 18:43:53.643 My-app [1055:434762] 代理人が返す値を確認してください。 2015-12-16 18:43:53.644 My-app [1055:434762]関連する UICollectionViewFlowLayoutインスタンスがあり、それが添付されています。層=; contentOffset:{0、0}; contentSize:{3087、307}> コレクションビューのレイアウト:。 2015-12-16 18:43:53.644 My-app [1055:434762] デバッガでUICollectionViewFlowLayoutBreakForInvalidSizesでシンボリックブレークポイント を作成します。

hannadsの提案に基づいて動作するソリューションです。より良い方法があれば教えてください

プロパティオブザーバでプロパティを作成しました。

var myCollectionViewHeight: CGFloat = 0.0 { 
    didSet { 
     if myCollectionViewHeight != oldValue { 
      myCollectionView.collectionViewLayout.invalidateLayout() 
      myCollectionView.collectionViewLayout.prepareLayout() 
     } 
    } 
} 

オーバーライドこのメソッド(それが複数回呼び出される)

override func viewDidLayoutSubviews() { 
    myCollectionViewHeight = myCollectionView.bounds.size.height 
} 

それから私は私のデリゲートでこれを持っている:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {    
      return CGSize(width: 100, height: myCollectionViewHeight) 
    } 

答えて

6

ここで私はそれをやるでしょう。最初に、コレクションビューの高さを格納するために使用されるビューコントローラにグローバル変数を追加します。 viewDidLayoutSubviews方法では、collectionViewの高さに、この変数を設定し、それが変更された場合、UICollectionViewレイアウトcollectionView細胞の大きさを設定するメソッドを呼び出し、中になる

collectionView.collectionViewLayout.invalidateLayout() 

を無効にするためのメソッドを呼び出しますこのメソッドでは、セルの高さをcollectionViewの高さを保持するグローバル変数に設定します。

注::現在、私の携帯電話にあり、このコードはテストしていません。私は何かを見逃したかもしれない。

+0

これは遠く離れているわけではありません。私は完全な答えで私の質問を更新します。 – LuckyLuke

+0

ただし、これはコレクションビューを最初に1回、レイアウトを無効にした後に1回レイアウトします。最も効率的なソリューションではなく、私が知っているソリューションです。あなたの更新を待っています。 – hannad

+0

@LuckyLukeあなたは 'viewDidLayoutSubviews'が複数回呼び出されたと述べました。私は、 'didSet'は' myCollectionViewHeight'がセットされるたびに呼び出されると思います。 'myCollectionViewHeight'が' myCollectionView.bounds.size.height'と等しくないかどうかを確認するためにifステートメントを追加してから設定することができますか?それが助けになるかもしれない。 – hannad

6

あなたのviewDidLoadにこのコードを設定してみてください。

self.automaticallyAdjustsScrollViewInsets = false 

Hこのヘルプを実行してください!

+0

ストーリーボードでこのプロパティを設定すると、オフセットにも役立ちます。それ以外の場合は、UICavisionControllerにUICollectionViewを配置すると、UICollectionViewがプッシュダウンされます。 「スクロールビューのインセットを調整する」のチェックを外す –

0

私もこの問題に遭遇しました。私は関連するsectionInsetsを差し引いて解決することができました。 .size.heightプロパティで考慮されていないインセットを減算すると、高さを受け入れます。あなたはセクションのインセットのサイズを減算する必要がsizeForItemAtIndexPathインサイド

...

let sectionInset = self.collectionView?.collectionViewLayout.sectionInset 
    let heightToSubtract = sectionInset!.top + sectionInset!.bottom 

    return CGSize(width: 100.0, height: (self.collectionView?.bounds.height)! - heightToSubtract) 

注:私はあなたがそれらを

+0

しかし、私はデリゲートメソッドでインセットを0に設定しています。これは必然ではないはずです。 – LuckyLuke

+0

@ LuckyLuke私はcontentInsetが0に設定されていると仮定していますか?これらの値を印刷して、すべてが0であることを確認できますか?あなたの高さが、collectionView.bounds.heightが設定されているものよりも大きく、プロジェクトを見ることなく伝えるのは難しいと言っているからです – bolnad

0

をチェックすることをお勧めしますここoptionalsをアンラップ強制が、安全のために私はこれを持っていました問題はの底に私のUICollectionViewを固定して、collectionViewの高さを与えなかったためです。

いくつかのネットワーク要求を行い、の[self.tableView reloadData]を呼び出した後、ログに同じエラーメッセージが表示されました。

私は下の制約を破り、UICollectionViewに固定された高さを与えて解決することができました。

関連する問題