2016-07-27 7 views
2

私はUITableViewをタップすると展開するセルを作成しました。 https://github.com/rushisangani/TableViewCellExpandUITableViewCellのintrinsicContentSizeの変更はどのように機能しますか?

基本的に、セルのコンテナビューには、拡大/縮小状態のコンテナとして機能する2つのサブビュー「front」と「back」があり、それぞれが上に拘束されています。セルのメインコンテンツビューの下端、先行端、および後端。セルを拡大または縮小するには、正面ビューと背面ビューの下部の制約にisActiveプロパティを切り替えるだけです。これは動作しますが、タップされたときにセルをリロードした場合に限ります。制約を変更してinvalidateIntrinsicContentSize()を呼び出せば、何も起こりません。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    { 
     // Expand/contract the cell and invalidate size (doesn't work) 
//  let cell = tableView.cellForRow(at: indexPath) as! ExpandingCell 
//  cell.tap() 
//  cell.invalidateIntrinsicContentSize() 

     // Keep track of the selected index and configure the expand/contract state when the cell is remade 
     tableView.deselectRow(at: indexPath, animated: false) 
     expandedIndexPath = indexPath 
     if(!expandedIndexPathArray.contains(indexPath)){ 
      expandedIndexPathArray.append(indexPath) 
     } 
     else{ 
      expandedIndexPathArray = expandedIndexPathArray.filter({$0 != indexPath}) 
     } 

     // Whenever a cell's intrinsicContentSize changes, it must be reloaded 
     tableView.reloadRows(at: [indexPath], with: .none) 
    } 

何が起こっているのですか?セルが再ロードされずにサイズを再計算できないのはなぜですか?

答えて

2

あなたはそれらの固有のコンテンツのサイズに基づいて細胞を拡大/縮小したい場合は、以下の3つのステップ実行する必要があります。静的テーブルについて

tableView.rowHeight = UITableViewAutomaticDimension 
tableView.estimatedRowHeight = 44 

  1. は、テーブルビューを設定しますheightForRowAtIndexPathを実装し、UITableViewAutomaticDimensionを返す必要があります。

  2. 更新セルの制約拡張/収縮状態を反映するために

  3. 変更を反映するために、テーブルビューを確認する:

    tableView.beginUpdates() 
    tableView.endUpdates() 
    
+0

甘い、私はセルをリロードするよりもはるかに優れていることが好き。なぜbeginUpdates()/ endUpdates()は機能しますが、invalidateIntrinsicContentSize()は動作しません。 – GoldenJoe

+0

iOS 6では、本来のコンテンツサイズが自動レイアウトで導入されました。これよりも前にテーブルビュークラスが導入されました。また、独自のアニメーションなどで変更をバッチします。 –

+0

自動レイアウトでセルのサイズ変更のプロセスがどのように機能するかに関する適切な文書はありますか?実際に自動レイアウトでセルを作成して動作させる方法はわかっていますが、その背後にある機構についても理解していただければ幸いです。 Appleのドキュメントは、いくつかの点では珍しいものです。 – GoldenJoe

関連する問題