1

我不确定这是可能的,但这是我的场景:我有这个 tableView 有 3 个部分。如果您触摸 AccessoriesImage 上第 3 部分中的白色星号,它将将该行插入到收藏夹部分,就像 Accessories.sku 一样。这工作得很好。

现在,当您将行添加到收藏夹时,收藏夹部分会变大并将第三部分推到屏幕下方。我知道在向第二部分添加行时显然需要这样做。但是,最后一个部分有 400 多行,您可以非常快速地将前两个部分滚动到屏幕之外,我想在这里停止滚动。

发生的情况是,您向下滚动查看第 3 部分中的行,而前两个部分远离可见屏幕。然后你触摸一行上的星号来添加一个新的收藏夹,这会触发该行被插入到第 2 部分,收藏夹部分。但是,当它进行插入时,它也会将您当前的视图向下推一排。我知道当收藏夹部分可见时这是不可避免的,但是当该部分离开屏幕时,我不想看到我的行因为插入而被推下。

下面的第二张图片可能有助于解释更多。在这里,我们已经向下滚动了屏幕。如果我单击星号添加收藏夹,它会在第 2 部分中向上插入一行,并将您在该图像中看到的行向下推一行。我只想在上面插入时保留这些行。

我很想听听你的想法。谢谢。

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

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];
}

您还需要仅在 table view contentSize 大于(或将变得)大于 tableView 大小时执行 setContentOffset:animated: 方法。希望有帮助!

于 2012-12-10T21:59:46.260 回答