2017-03-25 21 views
1

に基づいてテーブルビューのセルの高さを調整する方法のUITableViewCell内部UICollectionView私は、次のレイアウト画面サイズ

  • を持っているのUITableView
    • のUITableViewCell(クラス:CategoryCell)
      • ラベル
      • ボタン
      • UICollectionView
        • UICollectionViewCell(クラス:ItemCell)
          • UIImageView
          • UILabel

私はいつも3つの項目を表示するようになしUICollectionViewを作るしようとしています画面のサイズに関係します。画面の幅に基づいてアイテムを表示することができ、高さを設定することができました。ただし、CategoryCellの内部からテーブルビューの高さは変わりません。コードは次のとおりです。

// CategoryCell.swift 

func awakeFromNib() { 
    super.awakeFromNib() 

    // Calculate width and height based on screen width 
    let screenWidth = UIScreen.main.bounds.width 
    let itemWidth = screenWidth/3.0 
    let itemHeight = itemWidth/0.75 // 3:4 aspect ratio 

    // Change height of table view cell 
    self.bounds.size.height = self.bounds.size.height - collectionView.bounds.size.height + itemHeight 
    // This is the line does nothing 
    // It should remove collectionView height from tableView (height of collectionView is set through autolayout) then add he new height to it. 

    // Set collection view height to equal to item height 
    collectionView.bounds.size.height = itemHeight 

    // set item height 
    let layout = collectionViewProducts.collectionViewLayout as! UICollectionViewFlowLayout 
    layout.itemSize = CGSize(width: itemWidth, height: itemHeight - 1.0) 
    // -1.0 because item/cell height needs to be SMALLER than collection view height 
} 

セルクラス内部からテーブルビューセルの高さを変更するにはどうすればよいですか?私の唯一の推測は、私はawakeFromNib内でこれらの操作を行うべきではないが、これらを呼び出す別の関数を見つけることができないということです。

編集:私はRxSwiftを使用していますので、私のデータのソースコードは以下の通りです:

let observable = Observable.just(data) 
observable.bindTo(tableView.rx.items(cellIdentifier: "CategoryCell", cellType: CategoryCell.self)) { (row, element, cell) in 
    cell.setCategory(category: element) 
}.disposed(by: disposeBag) 

tableView.rx.setDelegate(self).disposed(by: disposeBag) 

答えて

1

あなたはUITableViewDelegateheightForRowAtを実装し、変数に基づいて値を返すことができます。そして、あなたがどこでも変数を設定することができますUICollectionViewitemHeight計算。したがって、計算が完了したら、テーブルビューのデータリロードを実行でき、新しいitemHeight値を使用してレイアウトを更新する必要があります。

私はコードをテストしていませんが、上記はうまくいくはずです。問題が発生した場合や、何らかの理由で誤解された場合は、私に知らせてください。

0

すべてのセルに対してtableviewのセルの高さを指定する必要があり、それに基づいてコレクションビューのセルの高さを計算できます。 tableviewのセルの動的な高さのために、これらのメソッドを実装する必要があります。

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

固定高さが必要な場合は、これらの方法を使用して、計算に基づいてセルの高さを指定します。

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return fixedSize //e.g 100 
} 

このご希望があればお試しください。

+0

動的な高さが私にとって問題ありません。固定高さには、割り当てた高さのセルが表示されます。ただし、tableViewCellはtableView自体を更新しません。 – Gasim

+0

あなたはあなたのtableviewのデータソースを投稿し、ここにコードを委譲してください。 – Pankaj

+0

データソースコードを追加しました。私の代理人コードは上記で提供したものだけを持っています。 – Gasim

0

@Princeと@Fahimありがとうございました。あなたの答えは私にテーブルビューのデリゲートに私の行の高さのロジックを移動するアイデアを与えた。以来、私は画面の幅とアスペクト比に基づいて高さを計算しています。私はただのtableViewの高さに同じロジックを移動:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    let screenWidth = UIScreen.main.bounds.size.width 

    // 3 items + 10px gap between cells 
    let itemWidth = (screenWidth/3.0) - 20 

    // 3:4 aspect ratio + other elements 
    let itemHeight = (itemWidth)/0.75 + 110 

    return itemHeight 
} 

を今、このソリューションは、私のために正常に動作するために、それは考慮に入れ、細胞自体を取るので、私はそれを変更したいと思います。

答えに質問するのは変ですが、このスレッドに関連しているので、ここで質問するのが最善だと思います。どのようにしてindexPathからセルオブジェクトを取得できますか? tableView.cellForRow(at: indexPath)を使用するとアクセスが悪くなります。

+0

あなたはこのようにtableviewからcellを得ることができます。cell = tableView.cellForRow(at:indexPath)as! yourCellClass セルが表示されていないか、インデックスパスが範囲外である場合は、nilを返すことに注意してください。 – Pankaj

+0

EXC_BAD_ACCESが引き続き表示されます。 – Gasim

+0

どこにアクセスしたいですか?セルがまだ作成されていない場合はアクセスできません。 – Pankaj