26

下のテキストビューにテキストを入力するだけです。これを行うにはテーブル ビューを使用し、最後のセルにはテキスト ビューを使用します。複数行の長いテキストを入力すると、テキストビューが必要になり、セルがテイラーになります。そのため、セルの高さを更新する必要があります。しかし、テーブル ビューのリロードまたはリロード行を使用すると、テキスト ビューのコンテンツが消え、キーボードも消えます。それを修正する良い方法はありますか?

簡単にするためにツールバーを使用する必要がありますか?しかし、私はまだテーブルビューでそれができるとは思っていません。

4

4 に答える 4

66

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];
于 2012-12-28T10:16:33.263 に答える
-1

このライブラリをチェックしてください。これは、 を使用したメッセージ バブルの実装ですUITableView。セルが表示されるたびにcellForRow:atIndexPathが呼び出され、セルが描画されることに注意してください。

編集

使用できますheightForRowAtIndexPath

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Messages *message = [self.messageList objectAtIndex:[indexPath row]];
    CGSize stringSize = [message.text sizeWithFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:13]
                                    constrainedToSize:CGSizeMake(320, 9999) lineBreakMode:UILineBreakModeWordWrap];
    return stringSize.height + 78;
}
于 2012-12-28T08:12:33.620 に答える
-3

テーブル ビュー セルのサイズがスムーズに変更されません。ドット。

ただし、テキスト ビューは最後のセルにあるため、行のサイズ変更を簡単にシミュレートできるので幸運です。テーブルの中央にテキスト ビューを配置するのは、はるかに困難です。

テキストビューをテーブルビューの上に置きます。その位置を scrollViewDidScroll: の tableView の contentOffset と同期します。また、ユーザーが入力するときに、textView 用のスペースを残すために、tableView のアニメーション化可能な contentInset を使用します。textView がスクロール可能でないことを確認する必要がある場合があります。

于 2012-12-28T09:45:45.700 に答える