こんにちは、UITableViewCell
of UITableView
の動的な高さに答える質問がたくさんあります。しかし、私はそれをやったときに変だと思う。
答えは次のとおりです。
通常、これはセルの動的な高さに答えます
tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension
しかし、私の場合、この行は何もしないのだろうか。
私のUITableView
は、splitview内のタブバーをクリックした後に表示されます。これは役に立ちますか?
たぶん私は何かが欠けています。誰も私を助けることができますか?.
これらはタイトルに対する私の制約であり、タイトルは長くなる可能性がありますが、ラベルはそうではありません。
これは私の細胞です
UITableViewAutomaticDimensionを機能させるには、セルコンテナービューに関連して、左、右、下、および上のすべての制約を設定する必要があります。あなたの場合、タイトルの下のラベルのスーパービュー制約に不足している下部スペースを追加する必要があります
プログラムで制約を追加しましたが、誤ってそれらをセルに追加しました。つまり、contentView
プロパティではありません。 contentView
に制約を追加すると解決しました!
行の高さと推定される行の高さの自動寸法を設定するには、次の手順に従って、セル/行の高さのレイアウトに自動寸法を有効にします。
UITableViewAutomaticDimension
をrowHeightおよびexpectedRowHeightに割り当てますheightForRowAt
およびそれに値UITableViewAutomaticDimension
を返します)-
目的C:
// in ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
@property IBOutlet UITableView * table;
@end
// in ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
self.table.dataSource = self;
self.table.delegate = self;
self.table.rowHeight = UITableViewAutomaticDimension;
self.table.estimatedRowHeight = UITableViewAutomaticDimension;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewAutomaticDimension;
}
スイフト:
@IBOutlet weak var table: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Don't forget to set dataSource and delegate for table
table.dataSource = self
table.delegate = self
// 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のラベルインスタンスの場合
注:動的な長さのラベル(UIElements)が複数あり、コンテンツサイズに応じて調整する必要がある場合:展開するラベルの 'Content Hugging and Compression Resistance Priority`を調整します/ compressをより高い優先度で。
また、セル内のUILabelのLinesが0に設定されていることを確認します。1に設定されている場合、垂直方向に拡大しません。
IOS 11およびXcode 9.3の時点では、上記の情報のほとんどは間違っています。 Apple's Guide 設定を提案
tableView.estimatedRowHeight = 85.0
tableView.rowHeight = UITableViewAutomaticDimension
WWDC 2017セッション245 (動的タイプを使用したアプリの構築、ビデオへの16:33頃)は同様のことを示唆しています。これらはどれも私にとって違いはありませんでした。
字幕スタイルのセルの場合、自己サイズのテーブルビューセルを取得するために必要なのは、タイトルと字幕の両方の行数(属性インスペクターの[ラベル]セクション)を0に設定することだけです。これらのラベルの1つが長すぎて、行数を0に設定しない場合、テーブルビューセルはサイズを調整しません。
特定のケースがあり、読んだソリューションの99%が機能しませんでした。私は自分の経験を共有すると思いました。この問題を解決する前に数時間苦労したので、それが役立つことを願っています。
私のシナリオ:
達成するために必要なこと:
スムーズに動作させるために確認する必要があるもの:
すべてのチュートリアルと回答でわかるように、ラベル/コンテンツ(上部、下部、先頭と末尾)のすべての制約を設定し、ContentView(スーパービュー)に設定します。 このビデオチュートリアルが役立ちます 。
ViewControllerのviewWillAppear
メソッドで、tableViews(tableView2
)の1つに行の推定高さを指定し、UITableViewAutomaticDimension
をそのまま使用します(およびすべてのチュートリアル/回答で見られます) ):
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView2.estimatedRowHeight = 80
tableView2.rowHeight = UITableViewAutomaticDimension
}
私にとって、これらの前のステップは十分ではありませんでした。私のTableViewは、estimatedRowHeightを取得し、セルの数で乗算します。ええ。
2つの異なるtableViewを使用しているため、それぞれにアウトレットtableView1
とtableView2
を作成しました。 viewDidLayoutSubviews
メソッドでサイズを変更できます。私がこれをどうやってやったかコメントしてください。
viewDidAppear
メソッドにこれを追加することにより、1つの追加ステップで修正されました。
override func viewDidAppear(_ animated: Bool) {
tableView1.reloadData() // reloading data for the first tableView serves another purpose, not exactly related to this question.
tableView2.setNeedsLayout()
tableView2.layoutIfNeeded()
tableView2.reloadData()
}
それが誰かを助けることを願っています!
tableView(heightForRowAt:indexPath:)
を削除するのを忘れた私のように、誤って削除するのを忘れたheightForRowAt
メソッドの定型コードである可能性があります。
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 60.0
}
これを試してみてください、それは私のために働くシンプルなソリューションです、
viewDidLoadでこのコードを書く
-(void)viewDidLoad
{
[super viewDidLoad];
self.tableView.estimatedRowHeight = 100.0; // for example. Set your average height
self.tableView.rowHeight = UITableViewAutomaticDimension;
}
cellForRowAtIndexPathにこのコードを書く
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ;
}
cell.textLabel.numberOfLines = 0; // Set label number of line to 0
cell.textLabel.text=[[self.arForTable objectAtIndex:indexPath.row] valueForKey:@"menu"];
[cell.textLabel sizeToFit]; //set size to fit
return cell;
}
私の場合、2つのUITableViewがあり、このメソッドを次のように変更する必要がありました
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
CGFloat height = 0.0;
if (tableView == self.tableviewComments) {
return UITableViewAutomaticDimension;
}else if (tableView == self.tableViewFriends) {
height = 44.0;
}
return height;
}
私と同じ問題に直面したかもしれない人のために:私はそれを機能させるために1時間苦労しました。上下左右の制約があるシンプルなUIラベル。 willDisplayCellを使用してデータをセルに渡しましたが、これによりセルの高さに問題が生じていました。そのコードをcellForRowに入れる限り、すべて正常に機能しました。これがなぜ発生したのか理解できませんでした。おそらく、willDisplayCellが呼び出される前にセルの高さが計算されたため、適切な計算を行うコンテンツがありませんでした。私はちょうど同じ問題を抱えている人に言及し、おそらく助けたいと思っていました。
私のセットアップでは、最初にストーリーボードのUITableViewCell
の制約が上から下まで明確であることを再確認し、次に2か所でコードを変更する必要がありました。
UITableViewDelegate
のtableView(_:heightForRowAt:)
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
// return UITableViewAutomaticDimension for older than Swift 4.2
}
UITableViewDelegate
のtableView(_:estimatedHeightForRowAt:)
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
// return UITableViewAutomaticDimension for older than Swift 4.2
}
ステップ1および2では、特定の行だけに自動サイズ変更を適用できます。 UITableView
全体に適用するには、次を使用します。
tableView.rowHeight = UITableView.automaticDimension
tableView.estimatedRowHeight = UITableView.automaticDimension
// return UITableViewAutomaticDimension for older than Swift 4.2
3つの水平アイテムがあり、一番左に制約があり、中央のアイテムには上部、下部、左のアイテム、右のアイテムがありました。右のものには右があり、左は中央のアイテムです。解決策は、セルにある数以上の追加の左と右の制約を中央のアイテム(ラベル)に追加することでした。
UITableViewAutomaticDimensionを機能させるには、4つのコーナーのすべての制約がスーパービューに追加されていることを確認する必要があります。ほとんどの場合、UILabelでうまく機能しますが、UILabelがその時点でうまく機能していないときにUITextViewがうまくいくことがあります。したがって、UITextViewに切り替えて、ストーリーボードでScrolling Enabled
がオフになっていることを確認するか、プログラムで設定することもできます。
私は新しいソリューションを手に入れました。それは私にとってはうまくいきました。
基本的にUITableViewAutomaticDimension
はUITableView.automaticDimension
に名前が変更されました...願っています。
セル内のすべてのビューがセルではなくコンテンツビューに制限されていることを確認してください。
Appleが言うように:
セルのコンテンツビュー内にテーブルビューセルのコンテンツをレイアウトします。セルの高さを定義するには、コンテンツビューの上端と下端の間の領域を塗りつぶすための制約とビュー(定義された高さ)の切れ目のないチェーンが必要です。
iOS 11以降ではうまく機能していましたが、iOS 10では問題を解決するために追加しました
table.rowHeight = UITableView.automaticDimension
table.estimatedRowHeight = 200 // a number and not UITableView.automaticDimension
また、iOS 11以降で動作する場合でも「heightForRowAt」を追加してください。iOS10をサポートする場合は必要です
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}