2017-10-02 28 views
0

autolayoutを使用して欲望の動作を達成したい(または、デリゲートなどを使用してこれを行うことができない場合)。私が持っているものは、1つの静的セルを持つtableViewです。このセルには、動的プロトタイプセルを持つtableViewControllerを持つcontainerViewがあります。containerViewが埋め込まれた静的セルの動的な高さ

私が望むのは、autolayoutを使用して、コンテナビューが埋め込まれている静的セルの高さを動的に設定できることです。

これは絵コンテです:containerViewを持っているのViewControllerで

enter image description here

enter image description here

は、これらは私の制約(コンテナビューのcontentViewと静的セル)です私が持っているスタティックセル内には、ViewDidLoadメソッド:

それは自動レイアウトを設定することが可能ではないことを意味

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

しかし、これで静的セルの高さは本当に小さいです...:

override func viewDidLoad() { 
    super.viewDidLoad() 

    courseDetailTableView.estimatedRowHeight = 200 
    courseDetailTableView.rowHeight = UITableViewAutomaticDimension 
} 

そしてstaticCellとのtableViewのデリゲートを使用してコンテナビューのcontentViewにもう1つの制約を設定すると、高さを400に設定し、そのセルの高さは400です。

私はちょうど、自動レイアウトで道を設定する方法があるのだろうと思っていたコンテナビューの高さと一致するように静的セルのghtを設定します。

私は多分最初containerViewの高さを計算し、それが可能な仕事、私は簡単な方法

があるかどうかを知りたい可能性にheightForRowを設定するには、この高さを使用して、デリゲートを使用していることを知ってはどうもありがとうございます。

+0

なぜ、ContainerViewを含むもの、動的セルを持つUITableViewControllerを含んでいるのか、静的セルでこの混乱を招くのではなく、UITableViewControllerを使用しないでください。 –

+0

こんにちは@TarasChernyshenko私は、ここにすべてのものをラップすることは少し混乱しているように思っています。しかし、これは、他のコントローラとコントローラの隣に2つのテーブルビューを持つそれ以降のバージョンに必要です。今では意味がありませんが、後でもっと簡単になります(少なくとも私はそう考えています) – neteot

答えて

0

私はちょうど同じ問題に直面している人のために自分の質問に答えるだけです。静的セルである必要はありませんが、この答えは静的セルと動的セルに適用されます。

何をする必要があり、マスター・ビュー・コントローラで次に

func tableViewHeight() -> CGFloat { 
    tableView.layoutIfNeeded() 
    return tableView.contentSize.height 
} 

((layoutIfNeededを求めることを忘れないでください)プロパティまたは高さを計算する方法を設定しcontainerViewControllerでありますそれからちょうど頼む

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "containerSegue" { 
     guard let containerVC = segue.destination as? SessionCoordinatorController else { return } 
     sessionController = containerVC 
    } 
} 

:あなたがそうのようなセグエ方法の準備に例えばcontainerViewControllerへの参照を保存する必要が埋め込まcontainerViewControllerであるセルを持っている1) (masterViewController中)ので、同様のUITableView heightForRowAtのデリゲートメソッドでコンテナの高さ:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    guard let height = sessionController?.tableViewHeight() else { return UITableViewAutomaticDimension } 
    return height 
} 

そして、それはこれだけです

containerViewController

にfalseにtableView.isScrollEnabledを追加することを忘れないでください。
0

だから私が正しく理解していれば、あなたが実際にこれらの制約があります。

  • ContentView.bottom = ContainerView.bottom
  • ContentView.trailing = ContainerView.trailing +標準
  • ContainerView.leading = ContentView.leading +標準
  • ContainerView.top = ContentView.top

基本的WHあなたはこの制約があります:

  • ContentView.height = ContainerView.height right?しかし、それを置くと、あなたは非常に小さな細胞を持っていますか?

それはあなたがこのようなcontainerViewのために高さの最小値を修正するために制約を置くことを試みることができるケースだ場合:

  • ContainerView。高さは例えば高さ> = 400 //少なくとも400

次にあなたが同じ高さのためのオプションの制約を置くことを試みることができます。

  • ContentView.height = ContainerView.height(優先順位249または低い)

制約の優先度を下げることによって、「私はこの特別な制約があります。コンテクストビューがコンテナビューの高さに一致しても、それに近づかないと近似しても大丈夫です。

はここで自動レイアウトAutooLayout Understanding

P.Sについての詳細情報です:heightForRowAtIndexPath::automaticDimensionを返すことで、デリゲートメソッドあなたがのtableViewを実装する必要はありません。

+0

私が必要とするのは、containerViewに埋め込まれたcontainerViewの高さに合わせて増加する静的セルです(containerViewはUITableViewControllerです)。手動で高さを設定すると、自動レイアウトを使用してこれを達成したいと思いますが、contentViewの高さがわからないため、これを望ましくありません。それはいくつのセルを持っているかによって決まります – neteot

+0

したがって、これらの制約を試しましたか?ContainerView.height> = 400 //例えば高さが400の場合 次に同じ高さのオプション制約を入れようとすることができます: ContentView.height = ContainerView.height(優先度249または低) – Arrabidas92

+0

こんにちは@ Arrabidas92ありがとうございますが、提案されたソリューションが動作していません。 https://imgur.com/a/Ijg50 UITableViewの高さが0であるUIScrollViewの高さと同じだと思うので、高さが決して400以上ではないと思う(実際はそれさえも)。私は行かなければならないと思うもう1つのアプローチ: – neteot

関連する問題