2013-05-02 2 views
12

Obj-CとiOSプログラミングを学ぼうとしていますが、まだまだ新しいものです。私は、単純なRedditクライアントアプリケーションを作ってみることにしました。私はUITableViewの中にフロントページの投稿を表示しようとしています。各投稿はそれ自身のセルで表されています。テーブルセルの高さをテキストラベルの長さに応じて動的に設定する方法は?

cell.textLabel.numberOfLines = 0; 
cell.textLabel.text = [[tempDictionary objectForKey:@"data"] objectForKey:@"title"]; 
[cell.textLabel sizeToFit]; 

しかし、セルはタイトルテキストが長すぎる場合、それ自体をクリッピング終わる:セルに

は、ここで私はタイトルを設定しています方法です。ここで絵です:

enter image description here

は、どのように私は私の細胞が自動的に他の細胞または詳細テキストラベルを交差することなく、長いタイトルのラベルに対応するために、その高さを調整することができますか?

ありがとうございました!

答えて

18

新しいiOS 8では、これを簡単にする新しい方法があります。

自動レイアウト制約に従ってセルの高さを計算する新しいパラメータがあります。これはUITableViewAutomaticDimensionです。 View ControllerのviewWillAppearメソッドで使用できます。

のObjective C:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    self.tableView.estimatedRowHeight = 70.0; // for example. Set your average height 
    self.tableView.rowHeight = UITableViewAutomaticDimension; 
    [self.tableView reloadData]; 
} 

スウィフト:

override func viewWillAppear(animated: Bool) { 
    self.tableView.estimatedRowHeight = 70 // for example. Set your average height 
    self.tableView.rowHeight = UITableViewAutomaticDimension 
    self.tableView.reloadData() 

} 

仕事素晴らしく、あなたはあなたの例で欲しいなど。私にとっては、viewDidLoadに高さの項目を追加し、viewWillAppearに残すのはreloadData()だけです。有用なものはsourceです。

ドキュメントから:The default value of rowHeight is UITableViewAutomaticDimension.コードはそのままですが、iOS 8以降では行の高さを設定する必要はありません。

重要なことは、すべての制約を明示的に設定することです。トレーディング、トップ、ボトムまで。上記のコード行を追加することなく、まずそれを試してみてください。

+0

OMG保存してくれてありがとう!!!!!!!! :-) –

+0

これまでに最善の答え。 –

+0

@flinth awesome answer .. – ChenSmile

11

あなたが各テーブル行の正しい寸法を返すために、テキストに自分自身を測定する必要がありますが、基本的に

-[UITableViewDelegate tableView:heightForRowAtIndexPath:] 

ためdocumentation referenceをチェックアウトする必要があります。 NSStringsがスクリーンショットのように見える場合は、NSString UIKit Additionsを使用して測定できます(例:

-[NSString sizeWithFont:constrainedToSize:] 

制限されたサイズは、無限の高さを持つことができますが、表のセルのコンテンツビューの幅を持つことができます。

彼らは帰属文字列である場合は、あなたのテーブルビューのheightForRowAtIndexPathのデリゲートメソッドでboundingRectWithSize:options:context:

0

と呼ばれるNSAttributedStringのUIKit追加で同様の方法があります:

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

if (indexPath.row == 2) { 
    Message *aMessage = [customTableViewArray objectAtIndex:indexPath.row]; 

    if ([aMessage.msgBody length] <= 0) 
    aMessage.msgBody = @"  "; 
    CGSize constraint = CGSizeMake(450, 40000.0f); 
    CGSize size = [aMessage.msgBody sizeWithFont:[UIFont fontWithName:@"Helvetica" size:14] constrainedToSize:constraint lineBreakMode:UILineBreakModeCharacterWrap]; 
    size.height = MAX(size.height,36); 

    return 136+size.height; 

} else if(indexPath.row > 1) { 

     Message *aMessage = [customTableViewArray objectAtIndex:indexPath.row]; 

     if ([aMessage.msgBody length] <= 0) 
     aMessage.msgBody = @"  "; 
     CGSize constraint = CGSizeMake(450, 40000.0f); 
     CGSize size = [aMessage.msgBody sizeWithFont:[UIFont fontWithName:@"Helvetica" size:14] constrainedToSize:constraint lineBreakMode:UILineBreakModeCharacterWrap]; 
     size.height = MAX(size.height,36); 

     return 100+size.height; 

} else { 
     return 146; 
    } 

} 

は私が謝罪、私は唯一の一部が含まれていましたコード。これがすべてです。メッセージが空の場合、基本的に1つのサイズになります。ステートメントのelse if部分では、メッセージのサイズを取得し、そのメッセージサイズに基づいてセルサイズを設定します。

+1

私は少しこれを説明して、少し混乱していますか? 'aMessage.msgBody = @" ";"とは何ですか?なぜ136 + size.height、それ以外の場合146を返しますか? – Prefix

2

私のアプリのTidBITS Newsは、というのは、正確にはです。そして、私はそれがそれを行う方法を把握する最初のアプリの一つだと信じています。少なくとも、私がそれを書いた時点で、私はこれをした他のアプリは知りませんでした。私は自分のメソッドをProgramming iOS 4の本に掲載して以来、それは普遍的なものになっています(誰も私からそれを得たとは言いませんが、基本的にそれにアプローチするには賢明な方法があります)。

ここに私の本の現在のバージョンからの説明です:

http://www.apeth.com/iOSBook/ch21.html#_variable_row_heights

あなたが見ることができるように、トリックが上sizeWithFont:constrainedToSize:を呼び出すことによって、事前内のすべての行の高さをうまくすることです各行にが含まれているデータでラベルを付けてとし、必要な数式を実行します。これは、tableView:heightForRowAtIndexPath:が、の高さをすべての行、の前に決定するために、何度も前に呼び出されてデータが要求されるためです。

次に、cellForRowAtIndexPath:を求められたら、前に計算した高さ内にセルをレイアウトするために、事前に導出した結果を使用します。

オンGithub私は読んで実行できるダウンロード可能な完全なプロジェクトの例もあります。それはあなたが制約をもってそれをする方法を示します(iOS 6以降のみ)。その名前にvariableHeightsというch21の例を探します。

関連する問題