2010-12-06 57 views
4

我遇到了一个奇怪的滚动问题,我希望有人能帮我试图找出原因。问题使用内容插入滚动表格视图

我已经包含了我认为与该问题相关的部分代码,但很高兴能够更新此帖以及其他任何需要的内容。

我已经在tableview的内容嵌入区实现了一个拉来刷新视图。刷新会触发一个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]; 
    } 
} 

问题是,如果我开始滚动,而内容插图是“看得见”(即重装过程中)我得到这个怪异的行为在我的桌子部分做不要一直滚动到顶部 - 请参阅屏幕截图,以便清楚地了解我在此处描述的内容。

我在下面列出了几个截图,清楚地标识了目前正在发生的事情。

有没有人遇到过这个?关于我应该看什么来尝试修复它的任何想法?

提前许多感谢, 罗格

alt text

这是结果,如果我开始滚动表。图像顶部的橙色位是实际的导航栏,我期望表格部分(日期为2010年12月1日)。

alt text

回答

1

这不是预期的行为?你设置了tableView的contentInset,这个例子和这个例子中的scrollView相同,因此tableView将它的内容按给定的页边空白。选项卡视图底部与部分标题之间的距离为60px(视网膜屏幕截图中为120px),因此此值与contentInset.top值完全匹配。

我假设你在刷新后重置contentInset0.f;刷新完成后,您的错误行为会消失吗?

+0

也许我不明白内容插入功能,但我的问题是当滚动发生,而插图仍然不是零。 tsbleviewcells的行为和预期的一样,我希望标题部分也能跟上,但是他们会停留在插图?! – Rog 2011-01-09 12:40:41

+0

我检查了一个示例项目。虽然`contentInset`使内容如预期的那样向内移动,`clipsToBounds`不会将它夹在插入内容,也可能会出现这种情况。因此,在滚动浏览实际区域时,单元格可见,但标题被固定为`origin.x = 0.f`,这是您设置`contentInset`后查看它的位置。 – Pascal 2011-01-09 23:24:59

0

在我看来,tableView正在做你正在问它的东西。我不认为这是一个错误。

您正在从顶部向下移动插入物,但您永远不会重新提起它。你可以尝试一个else语句来反转你在if语句中做什么。

另外,你有没有考虑改变你的视图层次?你可以从tabView中取出标签,把它们放在屏幕的顶部,并在下面的tableView?那么你根本不用担心设置插入。只是一个想法,我没有看到应用程序的其余部分。

8

我想你在scrollViewDidScroll方法中有类似if (self.reloading) return;的东西?如果你开始重装

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

设置insetOnReloadYES:您可以将它添加到解决您的问题。

0

只需将contentOffset设置为y点1像素以上或以下,它就不会这样做。

CGPoint pt = scrollView.contentOffset; 
scrollView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, 0.0f, 0.0f); 

scrollView.contentOffset = CGPointMake(pt.x, pt.y-1);