滚动时UITableView页脚重置

时间:2014-11-30 17:51:18

标签: ios objective-c uitableview uiscrollview footer

我有一个简单的UITableView设置,并且页脚视图中只有一个UIActivityIndicatorView

viewDidLoad我致电:

[_tableView registerNib:[UINib nibWithNibName:@"FetchingResultsFooterView" bundle:nil] forHeaderFooterViewReuseIdentifier:@"TableViewFooterFetchingResultsView"];

然后我为我的页脚添加tableview方法:

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return [self tableViewFooterHeight];
}

-(CGFloat)tableViewFooterHeight
{
    return 88;
}

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    static NSString *headerReuseIdentifier = @"TableViewFooterFetchingResultsView";

    APFetchingResultsFooter *footer = [tableView dequeueReusableHeaderFooterViewWithIdentifier:headerReuseIdentifier];
    [footer setTag:kTableViewFooterTag];

    //Centre my activity indicator on screen
    CGFloat aiInset = ((_tableViewContainer.frame.size.width /2) - (footer.activityIndicator.frame.size.width /2));
    CGFloat aiOffset = _tableViewContainer.contentOffset.x + aiInset;
    [footer.activityIndicator setFrame:CGRectMake(aiOffset, ([self tableViewFooterHeight] /2) - (footer.activityIndicator.frame.size.height /2), footer.activityIndicator.frame.size.width, footer.activityIndicator.frame.size.height)];

    return footer;
}

这或多或少地按预期显示我的页脚,它与我的活动指示器一起显示。

如果它让你感到困惑,因为我在'UIScrollView'中有一个非常宽的'UITableView',我只是将我的活动指示器放在屏幕上,而不是通过抵消它来查看tableview的中心。

这导致这个代码只是在我滚动时更新活动指示器的位置,因此它保持居中(允许tableview比屏幕宽,以使用页脚)。

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    //Synchronise scrolling
    if (scrollView == _headerView) [_tableViewContainer setContentOffset:_headerView.contentOffset];
    else if (scrollView == _tableViewContainer) [_headerView setContentOffset:_tableViewContainer.contentOffset];

    //because the tableview can be wider than the screen, we adjust the footer contents to be centered as we scroll
    if (scrollView == _tableViewContainer)
    {
        APFetchingResultsFooter *footer = (APFetchingResultsFooter *)[_tableView viewWithTag:kTableViewFooterTag];

        CGFloat aiInset = ((_tableViewContainer.frame.size.width /2) - (footer.activityIndicator.frame.size.width /2));
        CGFloat aiOffset = _tableViewContainer.contentOffset.x + aiInset;
        [footer.activityIndicator setFrame:CGRectMake(aiOffset, ([self tableViewFooterHeight] /2) - (footer.activityIndicator.frame.size.height /2), footer.activityIndicator.frame.size.width, footer.activityIndicator.frame.size.height)];
    }
}

所以,这一切都非常简单。现在我的问题是:

当我垂直滚动时,当页脚在屏幕外然后再返回到屏幕上时,页脚会被重置。因此活动指标不居中。

我尝试将帧更新代码放在cellForRowAtIndexPath中哪种方式有效,但是当您在屏幕上滚动页脚时,会有一个延迟,您会看到指示器从其默认帧跳转到新的居中之一。

如何阻止这种情况,以便在屏幕上滚动(或创建页脚)时,在可以看到任何跳跃之前,使用新帧更新指示器视图?

我采取了错误的做法吗?

0 个答案:

没有答案