web-dev-qa-db-ja.com

UITableViewCellの高さを動的にサイズ変更する方法

すべてのセル内に編集可能なUITextViewを含む古典的なグループ化されたUITableViewがあります。このテキストビューは単一行または複数行にすることができ、ユーザーが書いてテキストが新しい行を開始するにつれてセルの高さを増やしたいと思います。

私の質問は:セルの高さを増やすためだけにテーブル全体をリロードする必要がありますか?他の方法はありませんか?

私は多くのことを検索してきましたが、以前の回答とチュートリアルでは、テキストの高さの計算方法、heightForRowAtIndexPathの実装方法など、既に知っていることについて話しています。私の懸念は、私が望むものを達成するために、ユーザーが新しいキャラクターを入力するたびに高さを計算し、テーブルをリロードしなければならないことです。

ありがとう。

57
araid

テーブル全体を常にリロードする必要はありません。代わりに、その1行だけを再ロードできます。

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
62
rickharrison
[tableView beginUpdates];
[tableView endUpdates];
84
Andrey Zverev

もっと具体的に言うと、はい、tableView:heightForRowAtIndexPath:を実装して新しい高さを計算し、rickharrisonが言うように[tableView reloadRowsAtIndexPaths:withRowAnimation]を呼び出す必要があります。セルが拡張された高さと通常の高さを持ち、タップしたときに成長するようにしたいとしましょう。できるよ:

-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*) indexPath 
{
    if ([expandedPaths containsObject:indexPath]) {
        return 80;
    } else {
        return 44;
    }
 }

-(void)tableView:(UITableView*) didSelectRowAtIndexPath:(NSIndexPath*) indexPath
{
    [expandedPaths addObject:indexPath];
    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
27
Elfred

-reloadRowsAtIndexPaths:withRowAnimationは、セルのフレームを変更した後でも、UITableViewCellの高さを変更しませんでした。 -reloadDataを使用して実行した場合にのみ機能しました:

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
[tableView reloadData];
5
windson