如何在点击"加载早期项目时将UITableView的滚动位置设置为上一个位置"按键

时间:2014-07-18 08:39:53

标签: ios objective-c xcode uitableview uiscrollviewdelegate

我有一个像iOS iMessage详细视图的tableView。此外,我在tableView顶部还有一个按钮,用于加载早期消息"。

当我将tableView滚动到顶部时,我的按钮出现,在我单击按钮后,我填充了早期记录并重新加载tableView。

当记录在tableView中重新填充时,滚动位置不会改变。

顺便说一句,我尝试将之前的位置值和setcontentoffset滚动到之前的CGPoint。但是当我点击按钮时,我意识到滚动位置始终为0。因此,在我setcontentoffset之后,滚动停留在顶部..

我需要将scrollview的位置重新定位到上一个区域。

---编辑---

我尝试改进我的方法"保留scrollview的先前位置"。

我找到了解决方案并且效果很好。我将为所有人分享;

将此添加到.h文件中:@property (nonatomic) CGFloat scrollsPreviousLocation;@synthesize scrollsPreviousLocation;到.m文件。

现在,这是诀窍:我从底部计算滚动的位置..不是从顶部。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    scrollsPreviousLocation = (self.tableView.contentSize.height - scrollView.contentOffset.y);
}

在计算过程之后,现在我需要将内容偏移设置为之前的位置;

[tableView reloadData];
CGPoint offset = CGPointMake(0,tableView.contentSize.height - scrollsPreviousLocation);
[tableView setContentOffset:offset animated:NO];

2 个答案:

答案 0 :(得分:8)

如果您在加载上一个内容之前位于表格视图之上,则contentOffset为0。如果您希望能够在重新加载上面上一行消息行的表格视图后保持相同的滚动位置,则必须执行以下操作:

// Save the contentSize of your table view before reloading it
CGFloat oldTableViewHeight = self.tableView.contentSize.height;

// Reload your table view with your new messages

// Put your scroll position to where it was before
CGFloat newTableViewHeight = self.tableView.contentSize.height;
self.tableView.contentOffset = CGPointMake(0, newTableViewHeight - oldTableViewHeight);

就是这样!

如果您之前的表格视图内容大小高度为10且新的内容大小为19,则您希望将内容偏移量设置为9(从重新加载之前的底部开始为10),等于19 - 10

答案 1 :(得分:0)

来自@Kevin Hirsch的答案,但在自动布局模式下,请记得添加tableView.layoutIfNeeded(),否则您将获得估计高度。 这是我在swift中的代码:

// Save the contentSize of your table view before reloading it

let oldTableViewHeight = self.tableView.contentSize.height

// Reload your table view with your new messages

self.tableView.layoutIfNeed()

// Put your scroll position to where it was before

let newTableViewHeight = self.tableView.contentSize.height;

self.tableView.contentOffset = CGPointMake(0, newTableViewHeight - oldTableViewHeight);