0

次のコードに従って、テーブルビューをプログラムでスクロールしようとしています。コンテンツのサイズを大きくしたため、残りの最後の数行がほとんど表示されないことに注意してください。手動で正しくスクロールして、必要なインデックスパスを一番上に取得できますが、プログラムでは発生していません。

[tableview reloadData];

CGSize size = tableview.contentSize;
size.height += 1000;
tableview.contentSize = size;

int rows = [tableview numberOfRowsInSection:0];
int numberofRowsInView = 17;
for (int i = 0; i < ceil((float)rows/numberofRowsInView); i++) {
    [tableview scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:i * numberofRowsInView inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
    ....
}

合計行数 60 の場合、このコードは 0 ~ 16、17 ~ 33、34 ~ 50、51 ~ 59 のセル ビューを返すと予想されますが、最後のスクロールでは 43 ~ 59、つまり上記のコードに基づいて 17 行のビュー全体を返します。最後のページの top indexpath は 51 でなければなりません!

誰かがこれを整理するのを手伝ってくれませんか。ありがとう。

これは手動でスクロールする画像です:

手動スクロール

これはプログラムで行われます。

プログラムによるスクロール

4

2 に答える 2

1

17 行が画面に収まる場合、17 未満のアイテムが表示されるようにスクロールすることはできません。そのため、テーブル ビューは、一番上にあるように要求した行を取得し、最も近い行までスクロールします。これは、ビューが行で「いっぱい」であることを意味します。基本的には、60 は (正確には) 17 で割り切れないため、テーブル ビューでは半分の「ページ」しか表示できません。


setContentOffset:animated:または、上部に配置したいセルのフレームに基づいてスクロール ビュー メソッドを使用することもできます( rectForRowAtIndexPath:)。

于 2013-07-21T17:04:11.050 に答える
0

私はこれを機能させるつもりはないようです。最後のページのセルがほんの少しの時間だけ必要なため、元のテーブルビュー フレームにリセットします。

int rows = [tableview numberOfRowsInSection:0];
int numberofRowsInView = 17;

for (int i = 0; i < ceil((float)rows/numberofRowsInView); i++) {
    NSUInteger remainingCells = rows - i*numberofRowsInView;
    if(remainingCells < numberofRowsInView) {
        CGRect frame = tableview.frame;
        frame.size.height = remainingCells * tableview.rowHeight;
        tableview.frame = frame;
    }

    [tableview scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:i * numberofRowsInView inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
     ......

  }

最後のページに残っているセルが正確に表示されるようになりました。もう contentSize を設定する必要はありません。

于 2013-07-21T18:24:58.993 に答える