14

Obj-C と iOS プログラミングを学ぼうとしていますが、まだ初心者です。簡単な Reddit クライアント アプリケーションを作成してみることにしました。フロントページの投稿を 内に表示しようとしていますUITableView。各投稿は独自のセルで表されます。

セルで、タイトルを設定する方法は次のとおりです。

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

ただし、タイトル テキストが長すぎると、セル自体が切り取られてしまいます。ここに写真があります:

ここに画像の説明を入力

セルの高さを、他のセルや詳細テキスト ラベルと交差することなく、長いタイトル ラベルに対応するように自動的に調整するにはどうすればよいですか?

助けてくれてありがとう!

4

4 に答える 4

19

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

自動レイアウト制約に関してセルの高さを計算する新しいパラメーターがあります。これはUITableViewAutomaticDimensionviewWillAppearビューコントローラーのメソッドで使用できます。

目標 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()

} 

あなたの例であなたが望むようにうまく働きます。私に関しては、reloadData() のみに高さのものを追加しviewDidLoadて残しました。便利なソースviewWillAppearもあります。

ドキュメントから:The default value of rowHeight is UITableViewAutomaticDimension.今のところコードはそのままにしておきますが、iOS 8 以降では行の高さを設定する必要がないことに注意してください。

主に行う必要があるのは、すべての制約を明示的に設定することです。たとえば、先頭、末尾、上、下などです。上記のコード行を追加せずに、最初に試してみてください。

于 2014-08-09T23:21:27.887 に答える
2

たまたま私のアプリ TidBITS News がまさにあなたが説明していることを実行します。そして、それを行う方法を見つけた最初のアプリの 1 つだったと思います。少なくとも、これを書いた時点では、これを行うアプリは他にありませんでした。私は自分の方法を著書「 iOS 4 のプログラミング」で公開し、それ以来、それは一般的なものになりました (ただし、誰もが私から得たものだと言っているわけではありません。基本的には、賢明なアプローチ方法は 1 つしかありません)。

私の本の現在のバージョンからの説明は次のとおりです。

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

ご覧のとおり、トリックは、各行に含まれるデータを使用してラベルを呼び出し、必要な計算を行うことにより、すべての行の高さを事前に計算することですこれは、データを要求される前に、すべての行の高さを決定するために、 が前もって何度も呼び出されるためです。sizeWithFont:constrainedToSize:tableView:heightForRowAtIndexPath:

次に、求められcellForRowAtIndexPath:たら、事前に得られた結果を使用して、以前に計算した高さ内にセルを配置します。

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

于 2013-05-02T19:38:02.600 に答える
0

テーブルビューのheightForRowAtIndexPathデリゲートメソッドで:

- (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 部分で、メッセージのサイズを取得し、そのメッセージ サイズに基づいてセル サイズを決定します。

于 2013-05-02T17:51:56.973 に答える