1

これが可能かどうかはわかりませんが、これが私のシナリオです。この tableView には 3 つのセクションがあります。accessoriesImage の 3 番目のセクションにある白い星をタッチすると、accessories.sku と同様に、その行が [お気に入り] セクションに挿入されます。それはうまくいきます。

これで、お気に入りに行を追加すると、お気に入りセクションが大きくなり、3 番目のセクションが画面の下に押し出されます。セクション 2 に行を追加するときに、明らかにこれを行う必要があることを理解しています。ただし、最後のセクションには 400 行以上あり、画面の上部の 2 つのセクションをすばやくスクロールできます。ここでスクロールを停止します。

何が起こるかというと、セクション 3 の行を見て下にスクロールすると、上部の 2 つのセクションが表示画面からはみ出してしまいます。次に、行の星にタッチして新しいお気に入りを追加します。これにより、その行がセクション 2 (お気に入りセクション) に挿入されます。ただし、その挿入を行うと、現在のビューが 1 行下に押し下げられます。お気に入りセクションが表示されている場合、これは避けられないことを理解していますが、そのセクションが画面から外れている場合、挿入のために行が押し下げられるのを見たくありません。

下の 2 番目の画像は、それをさらに説明するのに役立ちます。ここでは、画面を下にスクロールしました。星をクリックしてお気に入りを追加すると、セクション 2 に行が挿入され、その画像に表示されている行が 1 行下に押し出されます。上記の挿入を行うときに、これらの行を所定の位置に保持したいだけです。

あなたのアイデアをぜひお聞かせください。ありがとう。

ここに画像の説明を入力

ここに画像の説明を入力

4

1 に答える 1

3

まず、同じ画面でユーザーに表示される情報があまり繰り返されないデザインを検討することを強くお勧めします。これにより、アプリがより直感的になります。たとえば、お気に入りではないすべての行を切り替えるオプションを用意します。このようにして、すべての行を表示してお気に入りを選択するか、お気に入りからのみ選択する場合は非表示にすることができます。

第 2 に、このデザインを維持する場合は、挿入によるスクロールを停止しようとするのではなく、新しい行の挿入中にテーブル ビューを下にスクロールすることをお勧めします。ユーザーには、スクロールが発生していないように見えます。方法は次のとおりです。

UITableView には、CGPoint である ContentOffset プロパティがあります。このポイントの y プロパティは、テーブル ビューがどれだけ下にスクロールされるかを示す CGFloat です。したがって、コードで行を追加するときは、同時に画面も下にスクロールします。

// I use some variables for illustrative purposes here (you will need to provide them from your existing code):

// *** put your code to add or remove the row from favorites to your table view data source here ***

// start animation queue
[UIView beginAnimations:nil context:nil];
// check if a row is being added or deleted
if (isAddingRow) {
    // if added, call to insert the row into the table view
    [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:insertedIndexPath] withRowAnimation:UITableViewRowAnimationFade];
    // also tell the table view to scroll down the height of a row
    [tableView setContentOffset:CGPointMake(tableView.contentOffset.x, tableView.contentOffset.y + kHeightOfRow) animated:YES];
} else {
    // if deleted, call to delete the row into the table view
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:deletedIndexPath] withRowAnimation:UITableViewRowAnimationFade];
    // also tell the table view to scroll down the height of a row
    [tableView setContentOffset:CGPointMake(tableView.contentOffset.x, tableView.contentOffset.y - kHeightOfRow) animated:YES];
}
// launch animations
[UIView commitAnimations];

または、行が選択されているときにアニメーションを使用していない場合は、実際にアニメーションをオフにすることができます (アニメーションなしで上記と同じことを行います)。

// check if a row is being added or deleted
if (isAddingRow) {
    // if added, call to insert the row into the table view
    [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:insertedIndexPath] withRowAnimation:UITableViewRowAnimationNone];
    // also tell the table view to scroll down the height of a row
    [tableView setContentOffset:CGPointMake(tableView.contentOffset.x, tableView.contentOffset.y + kHeightOfRow) animated:NO];
} else {
    // if deleted, call to delete the row into the table view
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:deletedIndexPath] withRowAnimation:UITableViewRowAnimationNone];
    // also tell the table view to scroll down the height of a row
    [tableView setContentOffset:CGPointMake(tableView.contentOffset.x, tableView.contentOffset.y - kHeightOfRow) animated:NO];
}

また、テーブル ビューの contentSize が tableView のサイズよりも大きい (または大きくなる) 場合にのみ、setContentOffset:animated: メソッドを実行する必要があります。それが役立つことを願っています!

于 2012-12-10T21:59:46.260 に答える