我不确定这是可能的,但这是我的场景:我有这个tableView有3个部分。如果你触摸accessoriesImage第3部分中的白色星形,它会将该行插入收藏夹部分,就像accessories.sku一样。这很好用。
现在,当您向“收藏夹”添加行时,“收藏夹”部分会变大,并将第三部分推向屏幕。我知道在向第二部分添加行时显然需要这样做。但是,最后一节有400多行,你可以非常快速地滚动屏幕上的前两部分,我想停止滚动。
发生的情况是,向下滚动查看第3部分中的行,前两部分离开可见屏幕。然后你触摸一行上的星星添加一个新的收藏夹,这会触发该行插入第2部分,收藏夹部分。但是当它插入时,它也会将当前视图向下推一行。我知道当收藏夹部分可见时这是不可避免的,但当该部分不在屏幕上时,我不希望看到我的行因插入而被推下来。
下面的第二张图片可能有助于解释更多。在这里,我们在屏幕上向下滚动。如果我单击一个星形来添加收藏夹,它会在第2部分中向上插入一行,并将您在该图像中看到的行向下推一行。我只是想在上面插入时保留这些行。
我很想听听你的想法。感谢。
答案 0 :(得分:3)
首先,我建议您考虑在同一屏幕上没有向用户显示如此多重复信息的设计 - 这将使您的应用程序更直观。例如,有一个选项可以切换所有不受欢迎的行。这样,您可以显示所有行并选择收藏夹,或者如果您只想从收藏夹中选择,则隐藏它们。
其次,如果您决定保留此设计,我建议您在插入新行时向下滚动表格视图,而不是尝试停止插入引起的滚动。对于用户来说,这看起来似乎没有发生滚动。方法如下:
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];
}
只有当表视图contentSize(或将变为)大于tableView大小时,您还需要执行setContentOffset:animated:方法。希望有所帮助!