77.下拉刷新MJRefresh和UITableView的section headerView冲突的原因分析与解决方案

来源:互联网 发布:java 获取网页源代码 编辑:程序博客网 时间:2024/05/17 09:25


首先修改MJRefreshHeader.h 中的这个  目的是当HeadView已经处于当前屏幕顶端 时不要执行动画  直接设置偏移量为64

// 恢复insetoffset

        if (self.scrollView.mj_insetT > 64) {

            [UIViewanimateWithDuration:MJRefreshSlowAnimationDurationanimations:^{

                self.scrollView.mj_insetT -=self.mj_h;

                

                // 自动调整透明度

                if (self.isAutomaticallyChangeAlpha)self.alpha =0.0;

            } completion:^(BOOL finished) {

                self.pullingPercent =0.0;

            }];

        }else{

            self.scrollView.mj_insetT =64;

        }

2、在导入Mjrefresh的ViewController中实现UIScrollViewDelegate代理方法scrollViewDidScroll

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{

    if (self.tableView.header.state == MJRefreshStateRefreshing)

    {

        NSLog(@">>>>>>>>>>>>>>>>>>%f",scrollView.contentInset.top);

        if (scrollView.contentOffset.y >= -scrollView.contentInset.top

            && scrollView.contentOffset.y > -54 + -64 && scrollView.contentOffset.y < -64)

        {

            //注意:修改scrollView.contentInset时,若使当前界面显示位置发生变化,会触发scrollViewDidScroll:,从而导致死循环。

            //因此此处scrollView.contentInset.top必须为-scrollView.contentOffset.y

            scrollView.contentInset =UIEdgeInsetsMake(-scrollView.contentOffset.y +4,0,0,0);

        }

        elseif (scrollView.contentOffset.y >= -64)//0说明headerView已经在tableView最上方,不需要再修改了

        {

            scrollView.contentInset =UIEdgeInsetsMake(64,0,0,0);

        }

    }

}

注意  以上解决方案只适用于含有导航栏的ViewController  如果不含有导航栏  自行减去64

参考了:http://www.geekcome.com/content-10-2518-1.html

1 0
原创粉丝点击