web-dev-qa-db-ja.com

UITableView行の高さを取得してUITableViewCellのサイズに自動調整する方法

UITableView行の高さを取得してUITableViewCellのサイズに自動調整する方法は?

したがって、Interface BuilderでUITableViewCellを作成していて、その高さが標準サイズよりも大きいと仮定すると、UITableView行の高さを自動サイズにするにはどうすればよいですか? (つまり、インターフェイスビルダーで手動で高さを測定し、プログラムで設定するのではなく)

21
Greg

すべてのセルが同じである場合は、rowHeightUITableViewプロパティをセルのサイズに設定します。コンテンツに基づいてすべてが異なる場合は、-tableView:heightForRowAtIndexPath:を実装し、データソースに基づいて各行の高さを計算する必要があります。

32
Mark Adams

http://www.cimgf.com/2009/09/23/uitableviewcell-dynamic-height/ は、このための優れたチュートリアルです。

メインビットは

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
  // Get the text so we can measure it
  NSString *text = [items objectAtIndex:[indexPath row]];
  // Get a CGSize for the width and, effectively, unlimited height
  CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
  // Get the size of the text given the CGSize we just made as a constraint
  CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
  // Get the height of our measurement, with a minimum of 44 (standard cell size)
  CGFloat height = MAX(size.height, 44.0f);
  // return the height, with a bit of extra padding in
  return height + (CELL_CONTENT_MARGIN * 2);
}
37
Brian

テーブルビューのあるxibで、セルオブジェクトを追加し、それをソースコードのIBOutletにリンクできます。どこでも使用することはできません。これを使用してセルの高さを取得します。

次に、tableView:heightForRowAtIndexPath:では、そのオブジェクトを使用して高さを取得できます。これは100%自動ではありませんが、少なくともIBのセルビューで変更を行うときにソースコードを手動で更新する手間を省くことができます。


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return myDummyCellObject.bounds.size.height;
}

すべての行が同じタイプ(セル)である場合、上記のデリゲートメソッドを実装する代わりに、プログラムでtableView.rowHeightプロパティを設定できます。シナリオによって異なります。

ああ、そして-deallocでmyDummyCellObjectを解放することを忘れないでください。

13
Andrei Stanescu

IOS 8以降では、テーブルビューでこれらのオプションを指定することで セルのサイズを自動調整する を選択できます。

tableView.estimatedRowHeight = 85.0
tableView.rowHeight = UITableView.automaticDimension

これは、システムが既存の制約またはコンテンツに基づいて行を計算できる限り機能します。 automaticDimensionを設定すると、heightForRowAtIndexPathが呼び出されないことに注意してください。


より複雑なデータでは、一部のセルが自動的に計算される場合がありますが、特定の高さ計算ロジックが必要なセルもあります。この場合、only見積り行の高さを設定し、cellForRowAtIndexPathを正しく機能するセルの自動ロジックで実装する必要があります。

// Set the estimated row height in viewDidLoad, but *not* automatic dimension!
override func viewDidLoad() {
    // other viewDidLoad stuff...
    tableView.estimatedRowHeight = 85.0
    tableView.delegate = self
}

// Then implement heightForRowAtIndexPath delegate method
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if theAutomaticCalculationWorksForThisRow {
        return UITableView.automaticDimension
    } else {
        // Calculate row height based on custom logic...
        let rowHeight = 85.0
        return rowHeight
    }
}
0
Aron
self.tableView.estimatedRowHeight = 65.0; // Estimate the height you want
self.tableView.rowHeight = UITableViewAutomaticDimension; // auto change heights for multiple lines cells.

UITableViewDataSource必須メソッドを実装する場合:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = [self.todoArray objectAtIndex:indexPath.row];
    cell.textLabel.numberOfLines = 0; // allow multiple lines showing up

    return cell;
}
0
AidenX