3

これが私のアプリで欲しいものです。以下に示すのは、iPhone アプリ ストアの 2 つのスクリーンショットです。

スクリーンショット 1

スクリーンショット 2

アプリ ストアで使用されているのと同じように、基本的に「続きを読む」機能が必要です (上の 2 つの画像の「説明」セクションを参照してください)。ここの各セクション ( DescriptionWhat's NewInformationなど) はテーブル ビュー セルであると想定しています。内部のテキストは UILabel または UITextField です。

この機能を追加するためにこれまでに試したことは次のとおりです。

NSString *initialText = @"Something which is not a complete text and created just as an example to...";

NSString *finalText = @"Something which is not a complete text and created just as an example to illustrate my problem here with tableviews and cel heights. bla bla bla";

NSInteger isReadMoreTapped = 0;

私の cellForRowAtIndexPath 関数:

// Other cell initialisations 
if(isReadMoreTapped==0)
    cell.label.text =  initialText;
else
    cell.label.text = finalText;

return cell;

私の heightForRowAtIndexPath 関数:

// Other cell heights determined dynamically
if(isReadMoreTapped==0){
    cell.label.text =  initialText;
    cellHeight =  //Some cell height x which is determined dynamically based on the font, width etc. of the label text
}
else{
    cell.label.text = finalText;
    cellHeight = //Some height greater than x determined dynamically
}
return cellHeight;

最後に、 [その他] ボタンがタップされたときに呼び出される IBAction readMoreTappedメソッド:

isReadMoreTapped = 1;

[self.tableView beginUpdates];

[self.tableView endUpdates];

NSIndexPath* rowToReload = [NSIndexPath indexPathForRow:2 inSection:0]; // I need to reload only the third row, so not reloading the entire table but only the required one
NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil];
[self.tableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone];

これをすべて行った後、必要な機能を取得します。その特定のセルの新しい高さが計算され、新しいテキストが読み込まれます。しかし、TableView には非常に不自然な動きがあり、ユーザー エクスペリエンスが低下します。ただし、アプリ ストアの[その他] ボタンの場合はそうではありません。そのケースに不自然なジャークはありません。TableView はその場所に残り、変更されたセルのみがサイズが大きくなり、テキストがスムーズに表示されます。

iPhone アプリ ストアの [その他] ボタンで行ったような滑らかさを実現するにはどうすればよいですか?

4

4 に答える 4

4

問題は、行をリロードすることから発生する可能性があります。セルのプロパティを直接構成しようとしています。私は通常、行をリロードする必要がないように、専用の方法を使用してセルのコンテンツを構成します。

- (void)configureCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if(isReadMoreTapped==0)
        cell.label.text =  initialText;
    else
        cell.label.text = finalText;
    // all other cell configuration goes here
}

このメソッドは cellForRowAtIndexPath メソッドから呼び出され、セルを構成します

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    [self configureCell:cell forRowAtIndexPath:indexPath];
    return cell;
}

このメソッドを直接呼び出して、リロードを回避します。

isReadMoreTapped = 1;

[self.tableView beginUpdates];

[self.tableView endUpdates];

NSIndexPath* rowToReload = [NSIndexPath indexPathForRow:2 inSection:0];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:rowToReload];
[self configureCell:cell forRowAtIndexPath:rowToReload];
于 2013-07-09T06:38:19.967 に答える
1

コードに次の変更を加えてみてください。問題が解決すると思います。

  1. cell.label.textに設定する必要はありませんheightForRowAtIndexPath。それらを削除してください。

  2. ではreadMoreTapped、更新テーブルで十分です。

    isReadMoreTapped = 1;

    [self.tableView beginUpdates];

    [self.tableView endUpdates];

于 2013-07-09T07:34:44.150 に答える
0

次の呼び出しを削除します。

[self.tableView beginUpdates];
[self.tableView endUpdates];

または、リロード コードがそれらの間にあることを確認するように変更します。使用する方法で単一行のリロードが適切に処理されるため、それらを削除します。

[self.tableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone];

フェードのような行アニメーションを指定するだけです。

于 2013-07-09T06:45:45.140 に答える