4

私が使用するコードは次のとおりです。

//inserting a row at the bottom first
_numberOfRecords++;
[_tableView beginUpdates];
[_tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:_numberOfRecords-1 inSection:0]] withRowAnimation:UITableViewRowAnimationBottom];
[_tableView endUpdates];
//clear text
_inputField.text = @"";

//then scroll to bottom
CGPoint bottomOffset = CGPointMake(0, _tableView.contentSize.height + 44.0 + _tableView.contentInset.top - _tableView.bounds.size.height);
NSLog(@"%f", _tableView.contentSize.height + 44.0 + _tableView.contentInset.top - _tableView.bounds.size.height);
[_tableView setContentOffset:bottomOffset animated:YES];

これにより、テーブルビューが非常に奇妙な方法でスクロールされます。しかし、挿入の前にスクロールコードを配置すると、最後に挿入された行を無視することを除いて正常に動作します。つまり、最後の行までスクロールするのではなく、最後から 2 番目の行までスクロールします (もちろん、新しいロールを挿入する前にスクロールするためです)。

したがって、このコードには、スクロールする位置の問題はないと思います。問題はおそらく、テーブルビューへの行の挿入から来ています。テーブル ビューのスクロールのアニメーションに違反しています。

チャットビューを作成するためにこれを行っています。ユーザーがメッセージを送受信するたびに、メッセージを含む行をテーブル ビューに挿入し、一番下までスクロールします。そのため、ここでは tableView を使用します。ラベル付きのscrollViewを使用しようとしましたが、正常に動作しますが、チャットビューではtableViewの方が人気があるようです。

scrollViewかtableViewを使おうと思っていたら、Appleの組み込みメッセージアプリがtableViewを使っていることがわかったので、tableViewを採用。Label 付きの scrollView が tableView より優れているかどうか教えてください。

とにかく、新しい行を挿入した後、tableView を一番下までスクロールするにはどうすればよいですか?

4

2 に答える 2

8

使ってみてくださいUITableView's scrollToRowAtIndexPath::

[self.tableView scrollToRowAtIndexPath: atScrollPosition: animated:];
于 2013-11-13T23:31:16.843 に答える
1

これは私自身の解決策です:

[_tableView reloadData];

    //scroll to bottom
double y = _tableView.contentSize.height - _tableView.bounds.size.height;
CGPoint bottomOffset = CGPointMake(0, y);
NSLog(@"after = %f", y);
if (y > -_tableView.contentInset.top)
    [_tableView setContentOffset:bottomOffset animated:YES];

endUpdates の後にまず reloadData を実行します。これにより、新しい行を挿入した後に tableView contentSize が更新されます。次に、スクロール距離が contentInset.top よりも大きいかどうかを確認します (これは、テーブルビューがステータス バーとナビゲーション バーの後ろに隠れないようにするためです)。

または、単に使用することもできます

[self.tableView scrollToRowAtIndexPath: inSection: atScrollPosition: animated:];

をクリックして、目的の行までスクロールします。しかし、これはセクションとフッターを持つセルをうまく処理しません。プレーンな tableViewCell の場合、これを使用して魔法を実行できます。そうしないと、私のトリック ソリューションのパフォーマンスが向上する場合があります。

とにかく、すべての回答に感謝します。

于 2013-11-13T23:47:53.633 に答える