web-dev-qa-db-ja.com

UITableViewAutomaticDimensionが機能しないのはなぜですか?

こんにちは、UITableViewCell of UITableViewの動的な高さに答える質問がたくさんあります。しかし、私はそれをやったときに変だと思う。

答えは次のとおりです。

here および here

通常、これはセルの動的な高さに答えます

tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension

しかし、私の場合、この行は何もしないのだろうか。

私のUITableViewは、splitview内のタブバーをクリックした後に表示されます。これは役に立ちますか?

たぶん私は何かが欠けています。誰も私を助けることができますか?.

これらはタイトルに対する私の制約であり、タイトルは長くなる可能性がありますが、ラベルはそうではありません。

enter image description here

これは私の細胞です

enter image description here

67
CaffeineShots

UITableViewAutomaticDimensionを機能させるには、セルコンテナービューに関連して、左、右、下、および上のすべての制約を設定する必要があります。あなたの場合、タイトルの下のラベルのスーパービュー制約に不足している下部スペースを追加する必要があります

140
Zell B.

プログラムで制約を追加しましたが、誤ってそれらをセルに追加しました。つまり、contentViewプロパティではありません。 contentViewに制約を追加すると解決しました!

24
Eyeball

行の高さと推定される行の高さの自動寸法を設定するには、次の手順に従って、セル/行の高さのレイアウトに自動寸法を有効にします。

  • Tableview dataSourceとデリゲートを割り当てて実装します
  • 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のラベルインスタンスの場合

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

enter image description here

:動的な長さのラベル(UIElements)が複数あり、コンテンツサイズに応じて調整する必要がある場合:展開するラベルの 'Content Hugging and Compression Resistance Priority`を調整します/ compressをより高い優先度で。

20
Krunal

また、セル内のUILabelのLinesが0に設定されていることを確認します。1に設定されている場合、垂直方向に拡大しません。

18
CamQuest

IOS 11およびXcode 9.3の時点では、上記の情報のほとんどは間違っています。 Apple's Guide 設定を提案

    tableView.estimatedRowHeight = 85.0
    tableView.rowHeight = UITableViewAutomaticDimension

WWDC 2017セッション245 (動的タイプを使用したアプリの構築、ビデオへの16:33頃)は同様のことを示唆しています。これらはどれも私にとって違いはありませんでした。

字幕スタイルのセルの場合、自己サイズのテーブルビューセルを取得するために必要なのは、タイトルと字幕の両方の行数(属性インスペクターの[ラベル]セクション)を0に設定することだけです。これらのラベルの1つが長すぎて、行数を0に設定しない場合、テーブルビューセルはサイズを調整しません。

6
Zampano

特定のケースがあり、読んだソリューションの99%が機能しませんでした。私は自分の経験を共有すると思いました。この問題を解決する前に数時間苦労したので、それが役立つことを願っています。

私のシナリオ

  • 1つのViewControllerでtwo TableViewsを使用しています
  • 私はそれらのテーブルビューのカスタムセル(xib)を読み込んでいます
  • セル内の動的コンテンツは2つのラベルで構成されます
  • ページはScrollViewを使用します

達成するために必要なこと

  • 動的TableViewの高さ
  • 動的なTableViewCellsの高さ

スムーズに動作させるために確認する必要があるもの

  • すべてのチュートリアルと回答でわかるように、ラベル/コンテンツ(上部、下部、先頭と末尾)のすべての制約を設定し、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を使用しているため、それぞれにアウトレットtableView1tableView2を作成しました。 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()
    }
    

それが誰かを助けることを願っています!

6
Bptstmlgt

tableView(heightForRowAt:indexPath:)を削除するのを忘れた

私のように、誤って削除するのを忘れたheightForRowAtメソッドの定型コードである可能性があります。

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 60.0
}
5
Guy Daher

これを試してみてください、それは私のために働くシンプルなソリューションです、

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;
 }
3
Jaywant Khedkar

私の場合、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;
}
3
user1994956

私と同じ問題に直面したかもしれない人のために:私はそれを機能させるために1時間苦労しました。上下左右の制約があるシンプルなUIラベル。 willDisplayCellを使用してデータをセルに渡しましたが、これによりセルの高さに問題が生じていました。そのコードをcellForRowに入れる限り、すべて正常に機能しました。これがなぜ発生したのか理解できませんでした。おそらく、willDisplayCellが呼び出される前にセルの高さが計算されたため、適切な計算を行うコンテンツがありませんでした。私はちょうど同じ問題を抱えている人に言及し、おそらく助けたいと思っていました。

1
Thomas

私のセットアップでは、最初にストーリーボードのUITableViewCellの制約が上から下まで明確であることを再確認し、次に2か所でコードを変更する必要がありました。

  1. UITableViewDelegatetableView(_:heightForRowAt:)

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
        // return UITableViewAutomaticDimension for older than Swift 4.2
    }
    
  2. UITableViewDelegatetableView(_: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
0
Pranav Kasetti

3つの水平アイテムがあり、一番左に制約があり、中央のアイテムには上部、下部、左のアイテム、右のアイテムがありました。右のものには右があり、左は中央のアイテムです。解決策は、セルにある数以上の追加の左と右の制約を中央のアイテム(ラベル)に追加することでした。

0
user3739902

UITableViewAutomaticDimensionを機能させるには、4つのコーナーのすべての制約がスーパービューに追加されていることを確認する必要があります。ほとんどの場合、UILabelでうまく機能しますが、UILabelがその時点でうまく機能していないときにUITextViewがうまくいくことがあります。したがって、UITextViewに切り替えて、ストーリーボードでScrolling Enabledがオフになっていることを確認するか、プログラムで設定することもできます。

0
Terry Tan

私は新しいソリューションを手に入れました。それは私にとってはうまくいきました。

基本的にUITableViewAutomaticDimensionUITableView.automaticDimensionに名前が変更されました...願っています。

セル内のすべてのビューがセルではなくコンテンツビューに制限されていることを確認してください。

Appleが言うように:

セルのコンテンツビュー内にテーブルビューセルのコンテンツをレイアウトします。セルの高さを定義するには、コンテンツビューの上端と下端の間の領域を塗りつぶすための制約とビュー(定義された高さ)の切れ目のないチェーンが必要です。

0
fullMoon

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
    }
0
Bassant Ashraf