我遇到了一个奇怪的滚动问题,我希望有人可以帮我确定为什么会这样。
我已经包含了我认为与问题相关的代码部分,但很高兴用其他任何需要更新此帖子。
我在tableview的内容插入区域中实现了一个pull to refresh视图。刷新会触发Async NSURLConnection,它从Web服务器提取数据,解析相关信息并根据需要刷新表。
这是刷新过程开始的地方:
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
if (scrollView.contentOffset.y <= - 65.0f && !self.reloading) {
self.reloading = YES;
[self reloadTableViewDataSource];
[refreshHeaderView setState:EGOOPullRefreshLoading];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.2];
self.tableView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, 0.0f, 0.0f);
[UIView commitAnimations];
}
}
问题是如果我开始滚动而内容插入是“可见的”(即在重新加载期间)我得到这种奇怪的行为,我的表格部分不会一直滚动到顶部 - 请参见截图以清楚地看到什么我想在这里描述一下。
我在下面列了几个截图,清楚地说明了目前正在发生的事情。
以前有没有人经历过这个?关于我应该考虑尝试修复它的任何想法?
非常感谢, ROG
如果我开始滚动表格,这就是结果。图像顶部的橙色位是实际的导航栏,我期望表格部分(2010年12月1日)。
答案 0 :(得分:8)
我假设你的if (self.reloading) return;
方法中有类似scrollViewDidScroll
的内容?您可以添加此项来解决问题:
if (self.reloading) {
if (scrollView.contentOffset.y > -60.0 && scrollView.contentOffset.y < 0.0 && insetOnReload) {
[self.tableView setContentInset:UIEdgeInsetsMake(-scrollView.contentOffset.y, 0.0, 0.0, 0.0)];
}
else if (scrollView.contentOffset.y >= 0.0 && insetOnReload) {
[self.tableView setContentInset:UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)];
insetOnReload = NO;
}
return;
}
如果您开始重新加载,请将insetOnReload
设置为YES
。
答案 1 :(得分:1)
这不是预期的行为吗?您设置了tableView的contentInset
,这与此示例中的scrollView相同,因此tableView会根据您给定的边距对其内容进行插入。选项卡视图底部与节标题之间的距离为60px(视网膜截图中为120px),因此这与contentInset.top
值完全匹配。
我假设您在刷新后将contentInset
重置为0.f
;刷新完成后,你的错误行为会消失吗?
答案 2 :(得分:0)
在我看来,tableView正在完成你所要求的。我认为这根本不是一个错误。
你正在从顶部向下移动插入物,但你永远不会把它重新抬起来。您可以尝试使用else语句来反转您在if语句中执行的操作。
另外,您是否考虑过更改视图层次结构?你可以从tableView中取出标签,把它们放在屏幕的顶部并在下面有tableView吗?然后你根本不用担心设置插图。只是一个想法,我还没有看到应用程序的其余部分。
答案 3 :(得分:0)
只需将contentOffset设置为高于或低于1像素的y点,就不会这样做。
CGPoint pt = scrollView.contentOffset;
scrollView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, 0.0f, 0.0f);
scrollView.contentOffset = CGPointMake(pt.x, pt.y-1);