IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果

IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果(五)

五一劳动节马上来临,小伙伴有妹有很激动哟,首先祝天下所有的程序猿节日快乐!这个五一对于我来说有点不一样,我的人生从这个五一就转弯了,爱情长跑8年的我结婚了,一会支付宝账号我会公布出去,请自觉打款!谢谢合作。

灯光闪起来:

舞蹈跳起来:

歌曲唱起来:

----------------------------------------------------------------------------------------------------------------------------------------------------------

智能世界的里面,做多的是什么?对,是APP,铺天盖地的APP随之袭来,APP死亡潮也随之出现,我们生活在互联网的时代里,每个人都是产品经理,据说,我们每天用的APP不超过8个,反正我每天必用百度云,你懂得,虽然APP多,但是他们都有一个共同点,你们知道是什么?你们千万不要告诉我是用手机玩的,他们就是都下拉刷新和加载更多,这些产品经理所有的共同点,虽然下拉刷新的动画都不一样,但是他们的目的只有个,就是获取服务器最最新的数据,我们都知道Android里面有很多开源的下拉刷新的第三方比如有名的:Android-PullToRefresh。这个开源的很强大啊,支持很多控件,ListView、ViewPager、WevView、ExpandableListView、GridView、(Horizontal )ScrollView、Fragment 点击下载,当然你也可以自己写!既然是土豪的玩的IOS,怎么可能少了第三方的下拉刷新:但是比较有名的就是:EGOTableViewPullRefresh跟MJRefresh点击下载1------------点击下载2。我自认为上拉加载更多对用户简直是一直折磨,翻到最后一页,竟然还要上拉一下才能加载更多。一点也不顺畅,但是我感觉自动加载更多比较人性化,感觉很顺!自己的观点而已!下面我是使MJRefresh这个来学习的,自己集成的自动加载更多,下面来效果图:

我们发现我们不需要上拉就可以自动加载更多,我感觉这种用户体验比较好:

继承步骤:

1:首先我们需要把MJRefresh这个开源的项目下载,把里面

全部考进自己的项目中,要先把这个文件拷贝到自己的项目的目录中,在xcode上右键add file这个文件我们才能把这个所需要的文件考进来,

2:实现:直接看代码:

//
//  ViewController.m
//  MyUitableViewRefreshAndMore
//
//  Created by xiaoyuan on 15/4/28.
//  Copyright (c) 2015年 xiaoyuan. All rights reserved.
//

#import "MyUitableViewRefreshViewController.h"
#import "MJRefresh.h"
#import "DataSingleton.h"

static const CGFloat MJDuration = 1.0;
//#define MJRandomData [NSString stringWithFormat:@"随机数据---%d", arc4random_uniform(1000000)]
#define DISPATCH_TIME_NOW (0ull)
#define NSEC_PER_SEC 1000000000ull

@interface MyUitableViewRefreshViewController ()<UITableViewDelegate,UITableViewDataSource>

{

    UITableView *table;
    NSMutableArray *data;
    //判断是否加载完成
    BOOL isLoadIOver;

}

@end

@implementation MyUitableViewRefreshViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self .view .backgroundColor = [UIColor whiteColor];
    self.navigationController.navigationBar.barTintColor = [UIColor redColor];
    UILabel*title = [[UILabel alloc] initWithFrame:CGRectZero];
    title.text = @"刷新吧小宇宙";
    title.backgroundColor =[UIColor clearColor];
    title.textColor = [UIColor whiteColor];
    self.navigationItem.titleView = title;
    [title sizeToFit];

    [self.navigationController.navigationBar setTranslucent:NO];
    __weak typeof(self) weakSelf = self;

    if(data == nil){
        data  = [[NSMutableArray alloc] init];

    }
    self.view.backgroundColor = [UIColor whiteColor];
    table = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    table.backgroundColor =[UIColor whiteColor];
    table.separatorStyle = UITableViewCellEditingStyleNone;
    table.delegate =self;
    table.dataSource =self;
    [self.view addSubview:table];
    [table addLegendHeaderWithRefreshingBlock:^{
        [weakSelf loadNewData :YES];
    }];

    // 进入自动刷新
    [table.legendHeader beginRefreshing];

}

- (void)loadNewData:(BOOL)reresh
{
    isLoadIOver = NO;
    //刷新移除所有数据
    if(reresh){
        [data removeAllObjects];

    }

    // 1.添加假数据
    for (int i = 0; i<20; i++) {
        [data addObject:@(i)];

    }

    // 2.模拟2秒后刷新表格UI(真实开发中,可以移除这段gcd代码)
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(MJDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        // 刷新表格
        [table reloadData];
        isLoadIOver = YES;
        // 拿到当前的下拉刷新控件,结束刷新状态
        [table.header endRefreshing];
    });
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    //只要大于的数是小于第一次返回的个数就行
    return data.count > 10? data.count + 1 : data.count;

}

//
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

    return  1;

}

-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return  44;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    if([data count]>0){
        if(indexPath.row<[data count]){
            static NSString *CellIdentifier [email protected]"Cell";

            UITableViewCell*cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

            if(cell == nil){

                cell = [[ UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
                //避免点击把分割线搞掉
                cell.selectionStyle = UITableViewCellSelectionStyleNone;

                //这个千万要记住写小于44,因为系统默认的就是44 ,这个把我坑坏了,一直找不到原因,一直以为重用的原因
                //大于44就超出高度,系统就给回收掉了

                UIView*view= [[UIView alloc] initWithFrame:CGRectMake(0, 43, 400, 1)];
                view.backgroundColor = [UIColor grayColor];
                [cell addSubview:view];

            }
             cell.textLabel.text = [NSString stringWithFormat:@"%@",[data objectAtIndex:indexPath.row]];
            cell .textLabel.textAlignment = NSTextAlignmentCenter;
                return cell;

        }
    }

    //加载更多
    if(isLoadIOver){
    [self loadNewData:NO];

    }

    return [DataSingleton.Instance getLoadMoreCell:table andIsLoadOver:NO andLoadOverString:@"正在加载..." andLoadingString:(YES ? @"正在加载" : @"下面10个") andIsLoading:YES];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

DataSingleton类:

//
//  DataSingleton.h
//  MyUiTableRefresh
//
//  Created by xiaoyuan on 15/4/29.
//  Copyright (c) 2015年 xiaoyuan. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "LoadingCell.h"

@interface DataSingleton : NSObject

#pragma 单例模式
+ (DataSingleton *) Instance;
+ (id)allocWithZone:(NSZone *)zone;

//返回标示正在加载的选项
- (UITableViewCell *)getLoadMoreCell:(UITableView *)tableView
                       andIsLoadOver:(BOOL)isLoadOver
                   andLoadOverString:(NSString *)loadOverString
                    andLoadingString:(NSString *)loadingString
                        andIsLoading:(BOOL)isLoading;

@end
//
//  DataSingleton.m
//  MyUiTableRefresh
//
//  Created by xiaoyuan on 15/4/29.
//  Copyright (c) 2015年 xiaoyuan. All rights reserved.
//

#import "DataSingleton.h"
#import <QuartzCore/QuartzCore.h>

@implementation DataSingleton

- (UITableViewCell *)getLoadMoreCell:(UITableView *)tableView
                       andIsLoadOver:(BOOL)isLoadOver
                   andLoadOverString:(NSString *)loadOverString
                    andLoadingString:(NSString *)loadingString
                        andIsLoading:(BOOL)isLoading
{
    LoadingCell * cell = [tableView dequeueReusableCellWithIdentifier:@"loadingCell"];
    if (!cell) {
        NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"LoadingCell" owner:self options:nil];
        for (NSObject *o in objects) {
            if ([o isKindOfClass:[LoadingCell class]]) {
                cell = (LoadingCell *)o;
                break;
            }
        }
    }
    cell.lbl.font = [UIFont boldSystemFontOfSize:15 - 2];
    cell.lbl.text = isLoadOver ? loadOverString : loadingString;
    if (isLoading) {
        cell.loading.hidden = NO;
        [cell.loading startAnimating];
    }
    else
    {
        cell.loading.hidden = YES;
        [cell.loading stopAnimating];
    }
    return cell;
}

#pragma 单例模式定义
static DataSingleton * instance = nil;
+(DataSingleton *) Instance
{
    if(nil == instance) {
        @synchronized(self) {
            if(nil == instance) {
                instance = [[DataSingleton alloc] init];
            }
        }
    }
    return instance;
}

//-(void) dealloc
//{
//    [instance release];
//    [super dealloc];
//}
+(id)allocWithZone:(NSZone *)zone
{
    @synchronized(self)
    {
        if(instance == nil)
        {
            instance = [super allocWithZone:zone];
            return instance;
        }
    }
    return nil;
}
@end

主要代码就是这些,还有一个LoadingCell类,就不贴了,这主要是MJReresh得基础上加上自动加载,当然里面还有一些逻辑需要待开发的,比如网络的原因了,还有数据全部加载完成了,这些就看需求来改!最后感谢李明杰老师,开源了这么优秀的代码。祝大家五一快乐,东北走起,求偶遇!

时间: 2024-12-26 19:34:40

IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果的相关文章

Android下拉刷新库,利用viewdraghelper实现,集成了下拉刷新,底部加载更多,数据初始加载显示loading等功能

项目Github地址:https://github.com/sddyljsx/pulltorefresh Android下拉刷新库,利用viewdraghelper实现. 集成了下拉刷新,底部加载更多,以及刚进入加载数据的loadview.包括了listview与gridview的改写. 效果1: 效果2: 效果3: 效果4: 效果5: 使用说明: imageList=(ListView)findViewById(R.id.image_list); imageAdapter=new ImageA

Android ListView 下拉刷新 点击加载更多

最近项目中用到了ListView的下拉刷新的功能,总结了一下前辈们的代码,单独抽取出来写了一个demo作为示例. 效果图 下拉刷新: 加载更多: CustomListView.java [java] view plaincopy package com.example.uitest.view; import java.util.Date; import com.example.uitest.R; import android.content.Context; import android.uti

十分钟实现ListView下拉刷新上滑加载更多

说到ListView下拉刷新几乎每个APP都会用到,所以ListView下拉刷新是很重要的,就像ListView优化一样是你必会的东西. ListView实现下拉刷新如果我们开发人员自己编写相对来说比较费事的,当我们使用第三方库之后我们再来开发这个功能就会省事很多.相比与自己实现可以少编写不少代码,Android-PullToRefresh库可以轻松实现ListView的下拉刷新功能. 要使用Android—PullToRefesh库对ListView实现下拉刷新要经过以下几个步骤: 1.下载A

支持下拉刷新和上划加载更多的自定义RecyclerView(仿XListView效果)

首先看效果 下拉刷新:        上划加载        在项目更新的过程中,遇到了一个将XListView换成recyclerView的需求,而且更换完之后大体效果不能变,但是对于下拉刷新这样的效果,谷歌给出的解决方案是把RecyclerView放在一个SwipeRefreshLayout中,但是这样其实是拉下一个小圆形控件实现的,和XListView的header效果不同.在网上找了很多的别人代码,都没有实现我想要的效果,于是自己动手写了一个. 具体实现的效果有以下几条 下拉刷新功能:

最新Android ListView 下拉刷新 上滑加载

开发项目过程中基本都会用到listView的下拉刷新和上滑加载更多,之前大家最常用的应该是pull to refresh或它的变种版吧,google官方在最新的android.support.v4包中增加了一个新类SwipeRefreshLayout,地址 这个类的作用就是提供官方的下拉刷新,并且效果相当不错,而上拉加载更多则用我们自定义的listview,也是相当简单. 下拉刷新 简单的介绍下: 首先它是一个viewgroup,但是它只允许有一个子控件,子控件能是任何view,使用的时候,所在

iOS学习之路--下拉刷新和上拉加载更多

iOS学习之路--下拉刷新和上拉加载更多 简介 本文中笔者将和大家分享应用app中常用到的表单内容的下拉刷新和上拉加载更多的功能实现的方法. 内容 1.有哪些实现方法与各方法的优劣 使用过美团,大众点评的朋友们应该有注意到,当你向上滑动表单的时候会有更多的店铺加载进你的表单中,而当你下滑表单顶的时候,则会刷新表单的内容并从网络上获取最新的信息.通过下拉刷新和上拉加载更多的功能,使app可以获取更多用户想要的信息和获取最新的信息.那么这种功能如何实现呢,还请跟着笔者继续往下看. 目前来说,主要的实

Android 下拉刷新上啦加载SmartRefreshLayout + RecyclerView

在弄android刷新的时候,可算是耗费了一番功夫,最后发觉有现成的控件,并且非常好用,这里记录一下. 原文是 https://blog.csdn.net/huangxin112/article/details/78781682 ,这里是看了之后,结合自己实际遇到的问题写的. 首先引入包. //下拉框 implementation 'com.android.support:recyclerview-v7:28.0.0-beta01' implementation 'com.scwang.smar

Android第二十三期 - 256k的ListView下拉刷新和滚动加载数据

代码已经

Android 自定义 ListView 上下拉动&ldquo;刷新最新&rdquo;和&ldquo;加载更多&rdquo;歌曲列表

本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码太多,点击此处下载,自己调试一下. 下载 Demo 环境 Windows 2008 R2 64 位 Eclipse ADT V22.6.2,Android 4.4.3 SAMSUNG GT-I9008L,Android OS 2.2.2 测试数据 本演示的歌曲信息,共有 20 条,包括歌手名.歌曲名.时长.缩