发出带有内容插入的滚动表视图

时间:2010-12-06 10:12:40

标签: iphone cocoa-touch uitableview

我遇到了一个奇怪的滚动问题,我希望有人可以帮我确定为什么会这样。

我已经包含了我认为与问题相关的代码部分,但很高兴用其他任何需要更新此帖子。

我在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

alt text

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

alt text

4 个答案:

答案 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);