beginUpdates
と を呼び出すと、セルのサイズがスムーズに変更されますendUpdates
。これらの呼び出しの後、tableView はテーブル内のすべてのセルを送信tableView:heightForRowAtIndexPath:
し、tableView がすべてのセルのすべての高さを取得すると、サイズ変更をアニメーション化します。
また、セルのプロパティを直接設定することで、セルをリロードせずにセルを更新できます。tableView を使用する必要はありません。tableView:cellForRowAtIndexPath:
セルのサイズを変更するには、次のようなコードを使用します
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
NSString *newText = [textView.text stringByReplacingCharactersInRange:range withString:text];
CGSize size = // calculate size of new text
if ((NSInteger)size.height != (NSInteger)[self tableView:nil heightForRowAtIndexPath:nil]) {
// if new size is different to old size resize cells.
// since beginUpdate/endUpdates calls tableView:heightForRowAtIndexPath: for all cells in the table this should only be done when really necessary.
[self.tableView beginUpdates];
[self.tableView endUpdates];
}
return YES;
}
リロードせずにセルの内容を変更するには、次のようなものを使用します。
- (void)configureCell:(FancyCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
MyFancyObject *object = ...
cell.textView.text = object.text;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
FancyCell *cell = (FancyCell *)[tableView dequeueReusableCellWithIdentifier:@"CellWithTextView"];
[self configureCell:cell forRowAtIndexPath:indexPath];
return cell;
}
// whenever you want to change the cell content use something like this:
NSIndexPath *indexPath = ...
FancyCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[self configureCell:cell forRowAtIndexPath:indexPath];