私は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)
}
何が起こっているのですか?セルが再ロードされずにサイズを再計算できないのはなぜですか?
甘い、私はセルをリロードするよりもはるかに優れていることが好き。なぜbeginUpdates()/ endUpdates()は機能しますが、invalidateIntrinsicContentSize()は動作しません。 – GoldenJoe
iOS 6では、本来のコンテンツサイズが自動レイアウトで導入されました。これよりも前にテーブルビュークラスが導入されました。また、独自のアニメーションなどで変更をバッチします。 –
自動レイアウトでセルのサイズ変更のプロセスがどのように機能するかに関する適切な文書はありますか?実際に自動レイアウトでセルを作成して動作させる方法はわかっていますが、その背後にある機構についても理解していただければ幸いです。 Appleのドキュメントは、いくつかの点では珍しいものです。 – GoldenJoe