首先,我会敦促您考虑一种不会在同一屏幕上向用户显示太多重复信息的设计——它会使您的应用程序更直观。例如,有一个切换所有非收藏行的选项。这样,您可以显示所有行并选择收藏夹,或者如果您只想从收藏夹中进行选择,则可以隐藏它们。
其次,如果您决定保留这种设计,我建议您在插入新行时向下滚动表格视图,而不是试图停止由插入引起的滚动。对用户来说,这似乎没有发生滚动。就是这样:
UITableView 有一个 ContentOffset 属性,它是一个 CGPoint。该点的 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];
}
您还需要仅在 table view contentSize 大于(或将变得)大于 tableView 大小时执行 setContentOffset:animated: 方法。希望有帮助!