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

blc*_*khm 1 xcode objective-c uitableview uiscrollviewdelegate ios

我有一个像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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Kev*_*sch 8

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

// 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);
Run Code Online (Sandbox Code Playgroud)

而已 !

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