下拉刷新

  • 添加加载刷新数据

    // 添加下拉刷新数据的提示控件
    UILabel *header = [[UILabel alloc] init];
    header.textAlignment = NSTextAlignmentCenter;
    header.textColor = [UIColor whiteColor];
    header.text = @"下拉可以刷新";
    header.backgroundColor = [UIColor redColor];
    header.CDH_height = 50;
    header.CDH_y = -header.CDH_height;
    header.CDH_width = self.tableView.CDH_width;
    [self.tableView addSubview:header];
    _header = header;
    
    • 注意: 不要轻易使用 headerView 作为下拉刷新的 view, 而一般将 headerView 作为广告 VIEW 或者是搜索 VIEW
    // 添加广告
    UILabel *ad = [[UILabel alloc] init];
    ad.textAlignment = NSTextAlignmentCenter;
    ad.textColor = [UIColor whiteColor];
    ad.text = @"我是广告";
    ad.backgroundColor = [UIColor grayColor];
    ad.CDH_height = CDHTitleViewH;
    self.tableView.tableHeaderView = ad;
    
  • 在scrollView代理方法中处理下拉刷新

    #pragma mark - ScrollView Delegate
    // 拖拽的时候就会调用
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
        // 处理下拉刷新
        [self deadDownHeaderRefresh];
    
        // 处理上拉刷新
        [self deadUpOnFooterRefresh];
    }
    
    #pragma mark - 下拉刷新DragDownFooterRefresh Method
    // 处理下拉刷新
    - (void)deadDownHeaderRefresh{
    
        // 如果下拉刷新的头部还未创建则直接跳过
        if (!_header) return;
    
        // 如果正在刷新, 则直接返回
        if(self.isHeaderRefreshing)return;
    
        // 当偏移量 <= offSetY 的时候, 说明下拉刷新的 heaer 已经完全显示
        CGFloat offsetY = - (self.tableView.contentInset.top + _header.CDH_height);
        // 下拉刷新的 header 完全出现了
        if (self.tableView.contentOffset.y <= offsetY) {
            // 即将开始刷新数据
            [self willDidLoadingNewRefreshStatus];
        }else{
            // 结束下拉刷新(恢复状态)
            [self willDidEndHeaderRefreshStatus];
        }
    }
    
  • 注意: 这里跟前面上拉刷新的时候是一样的, 在调用这个方法在 header 被创建之前, 所以要先做个判断

    // 如果下拉刷新的头部还未创建则直接跳过
    if (!_header) return;
    
  • 注意: 如果正在刷新则直接返回

    // 如果正在刷新, 则直接返回
    if(self.isHeaderRefreshing)return;
    
  • 在停止拖拽的时候做判断是否要重新请求刷新数据,

    // 停止拖拽
    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
        // 如果下拉刷新的头部为创建则直接跳过
        if (!_header) return;
    
        // 如果正在刷新, 则直接返回
        if(self.isHeaderRefreshing)return;
    
        // 当偏移量 <= offSetY 的时候, 说明下拉刷新的 heaer 已经完全显示
        CGFloat offsetY = - (self.tableView.contentInset.top + _header.CDH_height);
        // 下拉刷新的 header 完全出现了
        if (self.tableView.contentOffset.y <= offsetY) {
            // 正在刷新数据
            [self headerLoadingNewRefreshStatus];
        }else{
            // 结束下拉刷新(恢复状态)
            [self willDidEndHeaderRefreshStatus];
        }
    }
    
    • 如果下拉刷新的控件完全显示的时候修改显示状态, 并且,停留显示正在加载刷新数据, (修改内边距高度即可)
    - (void)headerLoadingNewRefreshStatus{
        _header.text = @"正在刷新数据...";
        _headerRefreshing = YES;
    
        // 增加内边距
        UIEdgeInsets inset = self.tableView.contentInset;
        inset.top += _header.CDH_height;
        self.tableView.contentInset = inset;
    
        // 下拉刷新请求数据
        [self didHeaderRefreshLoadNewTopics]; 
    }
    
    // 加载刷新下拉数据
    - (void)didHeaderRefreshLoadNewTopics{
        // 创建请求回话
        NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
        parameters[@"a"] = @"newlist";
        parameters[@"c"] = @"data";
        //    parameters[@"maxtime"] = _maxtime;
        parameters[@"type"] = @1;
    
        [[AFHTTPSessionManager manager] GET:CDHRequestURL parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
            // 保存需要加载跟多的字段
            _maxtime = responseObject[@"info"][@"maxtime"];
    
            // 写数据
            CDHAFNWriteToPlist(Essence/new_list);
    
            // 字典数组-->> 模型数组
            _topics = [CDHTopic mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
    
            // 刷新表格
            [self.tableView reloadData];
    
            // 结束上拉刷新数据
            [self didEndHeaderRefreshStatus];
    
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            // 结束上拉刷新数据
            [self didEndHeaderRefreshStatus];
        }];
    }
    
    • 注意: 如果在已经正在刷新了, 如果在次拖拽则什么也不做, 直接返回即可
    // 如果正在刷新, 则直接返回
    if(self.isHeaderRefreshing)return;
    
  • 刷新获取到数据之后还原显示(不管是成功还是失败, 都要结束刷新)

    // 结束下拉刷新(恢复状态)
    - (void)didEndHeaderRefreshStatus{
        // 先调用即将结束刷新
        [self willDidEndHeaderRefreshStatus];
        // 恢复内边距
        UIEdgeInsets inset = self.tableView.contentInset;
        inset.top -= _header.CDH_height;
        [UIView animateWithDuration:0.5 animations:^{
            self.tableView.contentInset = inset;
        }];
    }
    
    // 即将结束刷新
    - (void)willDidEndHeaderRefreshStatus{
        _header.text = @"下拉可以刷新";
        _header.backgroundColor = [UIColor redColor];
        _headerRefreshing = NO;
    }
    

results matching ""

    No results matching ""