iOS-UItableViewCellの高さを動的に調整

13495 ワード

Link Address:http://www.devdiv.com/home.php?mod=space&uid=39974&do=blog&id=2481
iOS-UItableViewCellの高さを動的に調整
iOS開発ドキュメント,by友盟翻訳グループstefaliu.
最初の目から見れば、高さを動的に調整するのは容易ではありません.そして、その最初の考えを解決しようとするのは往々にして正しくありません.この文章では、グラフのセルの高さをテキストの内容に応じて動的に変更する方法を示します.また、サブクラス化する必要はありません.もちろん、サブクラス化することで実現できますが、セルではなくグラフ自体のインスタンスでコードを複雑にすることができます.これは簡単なことですグラフにとって高さを動的に調整できることは意味がありますが、まずこの機能が必要なのは、長さが変化するテキストのリストを表示するときに、テキストの内容が少なければ通常のセルlabelに適しているかもしれませんが、テキストが長くなると、すべてのテキストの内容を表示するためにセルのサイズを再設定しなければなりません.セルのサイズを再設定する主な手順をまとめました.
1セルcellのサブビューとしてUITableViewCellを作成し、追加します.2 UITAbleViewの委任方法:(CGFloat)UILabel:(UITAbleView*)tableView:(NSIndexPath*)indexPathで高さを計算する3 UITAbleViewの委任方法:(tableView*)heightForRowAtIndexPath:(UITAbleView*)UITableViewCell tableView:(NSIndexPath*)indexPathでtableViewのボックスサイズを計算する.
次に、これらの手順を詳しく説明します.まず、プログラム出力のスクリーンショットを見てみましょう.cellForRowAtIndexPath通常のグラフでは、セル内のlabelのテキストの内容を簡単に次の方法で設定できます.
[[cell textLabel] setText:@"Text for the current cell here."];

そうすればUILabelを完全に制御できると思いますが、iOS-动态调整UITableViewCell的高度ボックスのサイズを変更する試みは失敗したことに気づきました.そのため、これは動的にサイズを調整する良い候補ではありません.
UILabelを設計し、セルのコンテンツビューに追加する必要があります.これを実装するには、次のようにコールする必要があります.
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

  UITableViewCell *cell;

  UILabel *label = nil;

 

  cell = [tv dequeueReusableCellWithIdentifier:@"Cell"];

  if (cell == nil)

  {

    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"] autorelease];

 

    label = [[UILabel alloc] initWithFrame:CGRectZero];

    [label setLineBreakMode:UILineBreakModeWordWrap];

    [label setMinimumFontSize:FONT_SIZE];

    [label setNumberOfLines:0];

    [label setFont:[UIFont systemFontOfSize:FONT_SIZE]];

    [label setTag:1];

 

    [[cell contentView] addSubview:label];

  }

}

これは完全なコードではありません.セルを作成するときにlabelを初期化するだけです.このコードは、-d e q u e R u s a b l e CellWithIdentifierを呼び出した後の判断モジュールif(cell==nil)に対応します.ここで私は2つの点を強調したいと思います.1つ目は、-setTag:1が呼び出されたため、labelに対応するラベルがあることに気づきます.cellがnilに等しくない場合、このラベルは使用できます.2つ目は、[cell contentView]addSubview:label]を呼び出して、labelをセルのコンテンツビューに追加します.これはlabelの初期化時にのみ使用されます.この関数を呼び出すたびにlabelがサブビューシーケンスに追加されます.次に、このコードを完全に補完しますが、cellの高さを設定する方法を見てみましょう.
cellの高さを計算する
複雑なcellでは、高さの計算は難しいかもしれませんが、高さが変化する部品に関心を持つだけでいいです.私の例では、セルに追加されたlabelだけを処理する必要があります.テキストのサイズに基づいてcellの高さを計算しますが、テキストのサイズはテキストの長さとテキストフォントに依存します.NSStringクラスは、cellのサイズを容易に取得するために関数-sizeWithFontを提供します.次のコードでは、関数UILabelについて説明します.
1

2

3

4

5

6

7

8

9

10

11

12

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

{

  NSString *text = [items objectAtIndex:[indexPath row]];

 

  CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

 

  CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

 

  CGFloat height = MAX(size.height, 44.0f);

 

  return height + (CELL_CONTENT_MARGIN * 2);

}

cellのサイズを計算するためにいくつかの定数を使用していることに気づきます.定義は次のとおりです.
#define FONT_SIZE 14.0f

#define CELL_CONTENT_WIDTH 320.0f

#define CELL_CONTENT_MARGIN 10.0f

定数CELL_CONTENT_WIDTHはcell全体の幅です.CELL_CONTENT_MARGINは私たちが定義したページの余白です.FONT_SIZEはテキストのフォントサイズを採用しています.
まず、コンテンツ幅の制約を作成します.CGSizeMakeの最初のパラメータは、合計のコンテンツ幅から2つのページ余白を減算することです.左と右にそれぞれページの余白があるからです.2番目のパラメータは私たちが提供した最大数値です.この制約は、後の関数-sizeWithFontで使用されます.-sizeWithFontでは、自動改行が許可されている場合と前述の制約条件で正しいサイズを取得するためにUILineBreakModeWordWrapに設定します.最後に、MAXマクロを使用してcellの高さを設定し、sizeを返すため、cellの高さが44画素未満であることを保証する.UILabelと44の2つの数の最大値です.最後に,上下のページの余白を考慮して最後の結果を得た.
読者がページの余白をイメージ化するために、次のスクリーンショットでは、labelの周りに境界が囲まれていることがわかります.[[label layer]setBorderWidth:2.0 f]を呼び出すと、この境界が表示され、ページの余白が表示されやすくなります.cellForRowAtIndexPath計算およびheightForRowAtIndexPathボックスサイズの設定
前に高さを計算する方法もheightボックスのサイズを設定する方法です.-iOS-动态调整UITableViewCell的高度コードを補完します.
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

  UITableViewCell *cell;

  UILabel *label = nil;

 

  cell = [tv dequeueReusableCellWithIdentifier:@"Cell"];

  if (cell == nil)

  {

    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"] autorelease];

 

    label = [[UILabel alloc] initWithFrame:CGRectZero];

    [label setLineBreakMode:UILineBreakModeWordWrap];

    [label setMinimumFontSize:FONT_SIZE];

    [label setNumberOfLines:0];

    [label setFont:[UIFont systemFontOfSize:FONT_SIZE]];

    [label setTag:1];

 

    [[label layer] setBorderWidth:2.0f];

 

    [[cell contentView] addSubview:label];

 

  }

  NSString *text = [items objectAtIndex:[indexPath row]];

 

  CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

 

  CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

 

  if (!label)

    label = (UILabel*)[cell viewWithTag:1];

 

  [label setText:text];

  [label setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))];

 

  return cell;

}

if(cell==nil)モジュールは初期化コードであり、cellが作成されたときにのみ実行されます.モジュール外部コードは、データ更新またはウィンドウドラッグのたびに呼び出される限り、毎回実行される-UILabel.
すなわち,labelのテキスト内容を毎回設定し,labelの外枠サイズを設定する必要がある.なお、labelが初期化されていない場合は、[cell viewWithTag:1]を呼び出してUILabelのハンドルを取得する必要があります.このコードは、前に計算した高さのコードとほぼ同じです.
まとめ
セルcellの高さを動的に計算するのは本当に難しくありません.複雑なcellがある場合は、コンテンツの幅と特定のテキストフォントのサイズに基づいてcellの高さを決定するだけです.外枠がどこに表示されているか分からない場合は、[[view layer]setBorderWidth:2.0 f]を呼び出して外枠を表示するだけです.これにより、図面表示の問題をより迅速に理解し、より深いレベルで理解することができます.
プレゼンテーションエンジニアリングファイル:cellForRowAtIndexPath
作者:Matt Long原文リンク:cellForRowAtIndexPath