不借助第三方插件利用ScrollView自身delegate实现下拉刷新和上拉加载

下拉刷新功能基本上在所有的app中都会被用到,而且这个功能已经被apple集成进去了,不过必须得是在tableViewController中才有,是一个叫做UIRefreshControl的控件,想看效果可以看手机QQ上面联系人列表下拉后的刷新。这里不多介绍。

本篇blog主要介绍如何在scrollview中实现下拉刷新的效果。因为有些时候我们可能更多地希望直接在scrollview中展现,而不是一定要局限于tableviewcontroller。

当然网上有很多下拉刷新和上拉加载的第三方控件,但是我这个人还是喜欢用系统原生API自己来做,一方面更能把原理吃透,另一方面方便自己定义。

好了,废话不多说了,直接上代码:

准备工作:

// 设置下拉刷新的process和label
    self.indicatorView = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(self.frame.size.width/2 - 50, -25, 20, 20)];
    [self.indicatorView setColor:[UIColor blackColor]];
    self.pullRefreshLabel = [[UILabel alloc]initWithFrame:CGRectMake(self.frame.size.width/2 -20, -30, 90, 30)];
    self.pullRefreshLabel.font = [UIFont fontWithName:@"heiti SC" size:14];
    [self.pullRefreshLabel setText:@"下拉刷新"];
    [self.scroll_view addSubview:self.indicatorView];
    [self.scroll_view addSubview:self.pullRefreshLabel];
    [self.scroll_view bringSubviewToFront:self.indicatorView];
    [self.scroll_view bringSubviewToFront:self.pullRefreshLabel];

这里的准备工作其实就是在scrollview里面先加入一个activityIndicator和一个label

下拉刷新

// 下拉刷新
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
    if (scrollView.contentOffset.y < -50 ) {
        [UIView animateWithDuration:1.0 animations:^{
            //  frame发生偏移,距离顶部50的距离(可自行设定)
            [scrollView setContentInset:UIEdgeInsetsMake(30, 0, 0, 0)];
            [self.indicatorView startAnimating];
        } completion:^(BOOL finished) {
            // 发起网络请求
            ...
            [self.indicatorView stopAnimating];
            [self.pullRefreshLabel setText:@"下拉刷新"];
            [scrollView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];
            // 将当前页面置为1
            currentPage = 1;
        }];
    }
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    // 保持indecator的位置一直在顶端
    if( scrollView.contentOffset.y < -50){
        [self.pullRefreshLabel setText:@"松开刷新"];
        self.indicatorView.frame = CGRectMake(self.frame.size.width/2-50, scrollView.contentOffset.y+20 ,30, 30);
        self.pullRefreshLabel.frame = CGRectMake(self.frame.size.width/2-20, scrollView.contentOffset.y+20, 100, 30);
    }else{
        self.indicatorView.frame = CGRectMake(self.frame.size.width/2-50, -30 ,30, 30);
        self.pullRefreshLabel.frame = CGRectMake(self.frame.size.width/2-20, -30, 100, 30);
    }
}

注意两个代理不要用错了。一个是WillBeginDecelerating ,一个是didScroll

willBeginDecelerating就是我们往下拉scrollview然后松手的时候,这个代理方法会去检测当前scrollview的contentoffset,然后根据下拉的程度决定是否进行刷新操作。这里我定义的阈值是50

然后为了使提示刷新的label和activityIndicator保持在一个固定的高度,就是不随着scrollview的往下拉而一直往下走,在didScroll代理里面计算了一下它们的位置。

上拉加载:

/ 上拉继续获取
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    /*
     *  关键-->
     *  scrollView一开始并不存在偏移量,但是会设定contentSize的大小,所以contentSize.height永远都会比contentOffset.y高一个手机屏幕的
     *  高度;上拉加载的效果就是每次滑动到底部时,再往上拉的时候请求更多,那个时候产生的偏移量,就能让contentOffset.y + 手机屏幕尺寸高大于这
     *  个滚动视图的contentSize.height
     */
    if (scrollView.contentOffset.y + scrollView.frame.size.height >= scrollView.contentSize.height+50) {
//        [UIView commitAnimations];
        [UIView animateWithDuration:1.0 animations:^{
            //  frame发生的偏移量,距离底部往上提高50(可自行设定)
            scrollView.contentInset = UIEdgeInsetsMake(0, 0, 50, 0);
        } completion:^(BOOL finished) {
            scrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
            // 发送网络请求
            currentPage ++;
            ...
        }];
    }
}
时间: 2024-12-22 14:52:19

不借助第三方插件利用ScrollView自身delegate实现下拉刷新和上拉加载的相关文章

windows-win8下 Eclipse3.7+MyEclipse10, 无法加载MyEclipse插件,大家帮帮忙

问题描述 win8下 Eclipse3.7+MyEclipse10, 无法加载MyEclipse插件,大家帮帮忙 win8下 Eclipse3.7+MyEclipse10, 无法加载MyEclipse插件 解决方案 我用MyEclipse offline解压也无法解决此问题,让懂eclipse高手来解答,现在我采用myeclipse 10.7.1应用程序来代替.

android scrollView判断停止(滑动到底部)并加载下一页

转自:http://blog.csdn.net/walker02/article/details/7331991  在网上看到一些网页在实现分页加载的时候,能够自动判断是否到达底部,然后自动加载下一页的内容,开始用的是ListView实现的,但是这个效果并不是很好,因为图片比较多出现了有些卡卡的现象,用了另外一种方式去实现了主要是为了对比一下速度的问题,找了很多最后发现可以使用ScrollView,查了很多ScrollView的文档但是没有多少能够使用到的的东西,可能也是水平有限吧,没有仔细的深

xlistview-安卓第三方下拉刷新Xlistview的点击事件

问题描述 安卓第三方下拉刷新Xlistview的点击事件 怎么实现Xlistview的点击事件呢 长按和短按 包括获取每个item里的值, 仿照一个例子写了 但是不成功 希望会的大侠指点 解决方案 下拉刷新XListView的简单分析XlistView下拉刷新,上拉加载更多改良xListView下拉刷新和上拉加载更多 解决方案二: 你可以监听每个item中的布局视图的各种点击事件,而不是listview的item的点击 解决方案三: 在getview中绑定

ThinkPHP使用Smarty第三方插件方法小结_php实例

本文实例讲述了ThinkPHP使用Smarty第三方插件的方法.分享给大家供大家参考,具体如下: 如果你在使用ThinkPHP框架的时候不想采用TP自带的模版系统,而使用第三方的模版系统,你有很多其他的选择,在这里我仅介绍Smarty这种比较官方,而且比较强大的模版系统. 由于Smarty兼容PHP4,因此,它的效率会相对低一点点,这个低只是相对的,估计等Smarty啥时候正式放弃PHP4的时候,效率可能会上很大一个台阶. 在TP框架的PlugIns目录下面,有一个SmartTemplate目录

如何动态加载控件以及插件编程思想(C#)

编程|动态|加载|控件 关键词:动态加载,控件,插件 控件,在实现快速开发中起着非常重要的作用,它可以将某一特定功能封装起来,供可户程序员调用,更重要的是它还可以实现插件式开发,使软件的灵活性.可扩充性大大增强.在网络上,也有很多动态加载控件.动态调用类成员等的资料.下面,我就将动态加载控件总结一下,以供大家参考.(不过由于本人水平有限,不一定有参考价值,写出来一方面是为了总结自己,以求提高,另一方面也希望各为朋友看到我的不足,给我提出宝贵意见)一.动态加载控件 动态加载,最基本用到的就是反射机

jquery 预加载图片效果插件与实例

文章一款告诉你如何利用jquery 预加载图片的实例教程,同时你也可以根据它出制作出漂亮的jquery 预加载图片效果哦. <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/x

安卓 scrollview嵌套listview上拉加载更多怎么实现啊

问题描述 安卓 scrollview嵌套listview上拉加载更多怎么实现啊 5C 如题 这个怎么实现啊,嵌套了监听不到 lv.setOnScrollListener(this) 这个事件 解决方案 Android scrollview中嵌套listview实现listview的下拉刷新上拉加载更多Android开发--上拉加载更多ListView实现ListView实现上拉加载更多 解决方案二: scrollview 直接嵌套listview 是不会实现上拉加载.两者一起使用起了冲突.这个时

listview-android scrollview动态加载数据

问题描述 android scrollview动态加载数据 先声明不是滑动加载更多数据,我要做一个订单的页面,scrollview里面的内容不确定是几条,如果里面嵌套listview,每个item的布局太复杂(包含很多按钮,edittext,下拉菜单等等),很容易冲突,而且item的高度可能超过了一屏幕,scrollview嵌套listview问题又很多,所以请高手帮忙,该如何实现!谢谢各位了! 解决方案 可以在- (void)scrollViewDidEndDecelerating:(UISc

浏览器--internet选项--程序--管理加载项中的加载项与插件是一个概念吗,有什么区别?

问题描述 问题一:浏览器--internet选项--程序-管理加载项中的加载项与插件是一个概念吗,有什么区别?问题二:我用360安全卫士的清理插件功能,找出的插件数量为什么远多于浏览器--internet选项--程序里的加载项啊?