86

可変長のテキスト データがテーブル ビューのセル ラベルに挿入されています。各セルの高さを適切なサイズにするために、次のように実装しましたviewDidLoad()

self.tableView.estimatedRowHeight = 88.0
self.tableView.rowHeight = UITableViewAutomaticDimension

これは、高さを 88.0 ピクセルと推定し、それより大きい場合は高さを自動的にサイズ変更する必要があります。まだスクロールされていないセル (セルUITableViewAutomaticDimentionのスクロール時に呼び出される) に対しては完全に機能しますが、テーブルにデータをロードするときに最初に画面上にレンダリングされるセルに対しては機能しません。

データの再読み込みを試みました (他の多くのリソースで提案されているように):

self.tableView.reloadData()

と の両方viewDidAppear()viewWillAppear()、それは役に立ちませんでした。私は迷っています..最初に画面にロードされたセルの動的な高さをレンダリングする方法を知っている人はいますか?

4

25 に答える 25

123

これを試して:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

編集

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

スイフト4

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

スウィフト 4.2

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

上記の両方のメソッドを定義します。
それは問題を解決します。

PS: これが機能するには、上下の制約が必要です。

ここに例があります

于 2015-05-28T04:52:40.533 に答える
42

これを使って:

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 300

使用しない:heightForRowAtIndexPathデリゲート関数

また、ストーリーボードでは、大量のデータを含むラベルの高さを設定しないでください。top, bottom, leading, trailing制約を与えます。

于 2016-06-11T03:08:44.137 に答える
11

この奇妙なバグは、他の回答では問題が解決されなかったため、Interface Builder パラメーターによって解決されました。

私がしたことは、デフォルトのラベルサイズをコンテンツの潜在的なサイズよりも大きくし、estimatedRowHeight高さにも反映させることだけでした. 以前、Interface Builder でデフォルトの行の高さを に設定し、コントローラーに次88pxのように反映しました。viewDidLoad()

self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 88.0

しかし、それはうまくいきませんでした。だから私はコンテンツが多分より大きくならないことに気づいた100pxので、デフォルトのセルの高さを108px(潜在的なコンテンツよりも大きい)に設定し、コントローラにそのように反映しましたviewDidLoad()

self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 108.0

これにより、コードは実際に初期ラベルを正しいサイズに縮小することができました。言い換えれば、サイズが大きくなることはありませんが、常に縮小する可能性があります...またself.tableView.reloadData()viewWillAppear().

これは非常に可変性の高いコンテンツ サイズには対応していないことはわかっていますが、コンテンツの最大文字数が制限されている状況ではうまくいきました。

これが Swift のバグなのか、Interface Builder のバグなのかはわかりませんが、魅力的に機能します。試してみる!

于 2015-05-29T15:35:58.303 に答える
10

行の高さと推定行の高さの自動寸法を設定し、次の手順を確認します。

@IBOutlet weak var table: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    // Set automatic dimensions for row height
    // Swift 4.2 onwards
    table.rowHeight = UITableView.automaticDimension
    table.estimatedRowHeight = UITableView.automaticDimension


    // Swift 4.1 and below
    table.rowHeight = UITableViewAutomaticDimension
    table.estimatedRowHeight = UITableViewAutomaticDimension

}



// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    // Swift 4.2 onwards
    return UITableView.automaticDimension

    // Swift 4.1 and below
    return UITableViewAutomaticDimension
}

例: UITableviewCell にラベルがある場合、

  • 行数を 0 に設定 (& 改行モード = 末尾を切り捨て)
  • そのスーパービュー/セル コンテナーに関して、すべての制約 (上、下、右左) を設定します。
  • オプション: データがなくても、ラベルで覆われる最小の垂直領域が必要な場合は、ラベルの最小の高さを設定します。

これは、動的な高さの制約を持つサンプル ラベルです。

ここに画像の説明を入力

于 2017-10-13T12:12:41.793 に答える
7

UITableView の動的サイズ変更セルには 2 つのことが必要でした

  1. テーブル ビュー セル内のビューに適切な制約を設定する (ほとんどの場合、ビューに適切な top 、 bottom 、および traling 制約を与えることが含まれます)
  2. viewDidLoad() で TableView のこれらのプロパティを呼び出す

     tableView.rowHeight = UITableViewAutomaticDimension
    
     tableView.estimatedRowHeight = 140
    

これは、swift 3 で書かれたセルフサイジング (動的テーブル ビュー セル) に関する素晴らしいチュートリアルです。

于 2017-04-03T07:34:17.553 に答える
2

私の場合-ストーリーボードには、下の画像のように2つのラベルがあり、 両方のラベルは、等しくする前に希望の幅の値が設定されていました。選択を解除すると、自動に変わります。いつものように、以下のものが魅力のように機能するはずです。

1.rowHeight = UITableView.automaticDimension, and
2.estimatedRowHeight = 100(In my case).
3.make sure label number of lines is zero.

ここに画像の説明を入力

于 2019-07-19T11:42:42.783 に答える
2

これは、次の 2 つのことを行う場合は簡単です。

  1. 自動高さの設定
tableView.rowHeight = UITableView.automaticDimension
  1. 上から下までFULL制約を持つすべての TableViewCells を作成します。最後の要素は、セルを終了するために下部のスペースを定義する必要があります。

したがって、レイアウト エンジンはセルの高さを計算し、値を正しく適用できます。

于 2019-08-29T10:18:00.490 に答える
1

私はあなたの解決策に触発され、別の方法を試しました。

tableView.reloadData()に追加してみてくださいviewDidAppear()

これは私にとってはうまくいきます。

スクロールの背後にあるものはreloadDataと「同じ」だと思います。画面をスクロールすると、reloadData()whenを呼び出すようなものviewDidAppearです。

これが機能する場合は、この回答に返信してください。この解決策を確認できます。

于 2016-03-23T17:40:46.577 に答える
0

私も最初にこの問題を抱えていました。このコードから問題を解決self.tableView.reloadData()しました。動的な高さのためにこのコードの代わりに を使用しないようにしてください。

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
于 2015-05-28T05:13:50.773 に答える
0

セルビュー/ビューの各オブジェクトに対してTOPBOTTOM、およびHEIGHTのすべての制約を設定し、存在する場合は中央の Y位置を削除する必要があります。これをしなかった場所では、アーティファクトを別のビューに配置するためです。

于 2017-06-26T14:58:12.217 に答える