下拉刷新
添加加载刷新数据
// 添加下拉刷新数据的提示控件 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; }