前言

讲下拉刷新及上拉加载之前先给大家解释UIScrollView的几个属性

  • contentSize是UIScrollView可以滚动的区域。
  • contentOfinset 苹果官方文档的解释是"内容视图嵌入到封闭的滚动视图的距离,我的理解是他实际上就是scrollView的Content View相对于scrollView的外壳的边距,他其实和CSS中的pading属性有点相似。
  • contentOffset是UIScrollView当前显示区域的顶点相对于frame顶点的偏移量,例如上面的例子如果拉到最下面,则contentOffset就是(0, 480),也就是y偏移了480.

下拉刷新及上拉加载原理

  • 下拉刷新实际上是监测UIScrollView的contentOffset的y值,当他往下拉动时,UIScrollView的contentOffset是一直减小的,然后把通过动画把它的contentInset值控制成一个定值,然后通过设置延时来把UIScrollView的contentInset的值恢复原点。啥话不说,上代码
//下拉刷新

    if (scrollView.contentOffset.y < -) {

        [UIView animateWithDuration:1.0 animations:^{

            self.scrollView.contentInset = UIEdgeInsetsMake(, , , );

        } completion:^(BOOL finished) {

            NSLog(@"发起下拉刷新");

            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

                [UIView animateWithDuration:1.0 animations:^{

                    self.scrollView.contentInset = UIEdgeInsetsMake(, , , );

                }];

            });

        }];

    }
  • 上拉加载其实原理和下拉刷新基本是一样的,只不过判断的contentOffset的值不同,如果scrollView.bounds.size.height +  scrollView.contentOffset.y >scrollView.contentSize.height,说明你执行了上拉操作,然后实现起来基本就和下拉刷新是一样的。
//上拉加载

    if (scrollView.bounds.size.height +  scrollView.contentOffset.y >scrollView.contentSize.height) {

        [UIView animateWithDuration:1.0 animations:^{

            self.scrollView.contentInset = UIEdgeInsetsMake(, , , );

        } completion:^(BOOL finished) {

            NSLog(@"发起上拉加载");

            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

                [UIView animateWithDuration:1.0 animations:^{

                    self.scrollView.contentInset = UIEdgeInsetsMake(, , , );

                }];
});
}]; }

下面奉上完整的demo代码,大家看不懂的可以私聊我,要是想深入了解的话可以去github搜索MJRefresh看完整的别人封装好的第三方

#import "ViewController.h"

@interface ViewController ()<UIScrollViewDelegate>

@property (nonatomic, strong) UIScrollView * scrollView;

@end

@implementation ViewController

- (UIScrollView *)scrollView {

    if (!_scrollView) {
_scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds]; //contentSize是可滑动的区域
_scrollView.contentSize = CGSizeMake(, );
_scrollView.backgroundColor = [UIColor grayColor];
_scrollView.delegate = self; //greenView实际上就是UIScrollView的content View
UIView * greenView = [[UIView alloc] initWithFrame:CGRectMake(, , self.view.bounds.size.width, )];
greenView.backgroundColor = [UIColor greenColor];
[_scrollView addSubview:greenView]; }
return _scrollView;
} - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView { //下拉刷新-当下拉刷新时,contentOffset实际上就是greenView相对于屏幕左上角的偏移量。
if (scrollView.contentOffset.y < -) { [UIView animateWithDuration:1.0 animations:^{ self.scrollView.contentInset = UIEdgeInsetsMake(, , , ); } completion:^(BOOL finished) { NSLog(@"发起下拉刷新"); //设置延时时间为2秒
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [UIView animateWithDuration:1.0 animations:^{
//恢复之前的contentInset,让greenView回到原来的地方
self.scrollView.contentInset = UIEdgeInsetsMake(, , , ); }]; }); }]; } //上拉加载 if (scrollView.bounds.size.height + scrollView.contentOffset.y >scrollView.contentSize.height) { [UIView animateWithDuration:1.0 animations:^{ self.scrollView.contentInset = UIEdgeInsetsMake(, , , ); } completion:^(BOOL finished) { NSLog(@"发起上拉加载"); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [UIView animateWithDuration:1.0 animations:^{ self.scrollView.contentInset = UIEdgeInsetsMake(, , , ); }];
});
}]; } } - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self.view addSubview:self.scrollView]; } - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

iOS 下拉刷新-上拉加载原理的更多相关文章

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

    在弄android刷新的时候,可算是耗费了一番功夫,最后发觉有现成的控件,并且非常好用,这里记录一下. 原文是 https://blog.csdn.net/huangxin112/article/de ...

  2. SwipeRefreshLayout实现下拉刷新上滑加载

    1. 效果图 2.RefreshLayout.java package myapplication.com.myapplication; import android.content.Context; ...

  3. 移动端下拉刷新上拉加载-mescroll.js插件

    最近无意间看到有这么一个上拉刷新下拉加载的插件 -- mescroll.js,个人感觉挺好用的,官网地址是:http://www.mescroll.com 然后我就看了一下文档,简单的写了一个小dem ...

  4. 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载

    title: 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载 tags: -RecyclerView,下拉刷新,上拉加载更多 grammar_cjkRuby: true - ...

  5. ListView实现Item上下拖动交换位置 并且实现下拉刷新 上拉加载更多

    ListView实现Item上下拖动交换位置  并且实现下拉刷新  上拉加载更多 package com.example.ListViewDragItem; import android.app.Ac ...

  6. [ionic开源项目教程] - 第7讲 实现下拉刷新上拉加载ion-refresher和ion-infinite-scroll

    第7讲 实现下拉刷新上拉加载ion-refresher和ion-infinite-scroll 1.将tab1.html的代码改为如下: <ion-content> <ion-ref ...

  7. JS+CSS实现的下拉刷新/上拉加载插件

    闲来无事,写了一个当下比较常见的下拉刷新/上拉加载的jquery插件,代码记录在这里,有兴趣将代码写成插件与npm包可以留言. 体验地址:http://owenliang.github.io/pull ...

  8. 基于SwiperJs的H5/移动端下拉刷新上拉加载更多的效果

    最早时,公司的H5项目中曾用过点击一个"加载更多"的DOM元素来实现分页的功能,后来又用过网上有人写的一个上拉加载更多的插件,那个插件是页面将要滚动到底部时就自动请求数据并插入到页 ...

  9. ListView下拉刷新上拉加载更多实现

    这篇文章将带大家了解listview下拉刷新和上拉加载更多的实现过程,先看效果(注:图片中listview中的阴影可以加上属性android:fadingEdge="none"去掉 ...

  10. RecyclerView下拉刷新上拉加载(三)—对Adapter的封装

    RecyclerView下拉刷新上拉加载(一) http://blog.csdn.net/baiyuliang2013/article/details/51506036 RecyclerView下拉刷 ...

随机推荐

  1. DBCP 配置备注

    <property name="initialSize" value="5"></property> <property name ...

  2. 玩转Windows服务系列汇总

    玩转Windows服务系列汇总 创建Windows服务 Debug.Release版本的注册和卸载及其原理 无COM接口Windows服务启动失败原因及解决方案 服务运行.停止流程浅析 Windows ...

  3. [译]基于GPU的体渲染高级技术之raycasting算法

    [译]基于GPU的体渲染高级技术之raycasting算法 PS:我决定翻译一下<Advanced Illumination Techniques for GPU-Based Volume Ra ...

  4. 关于apue.3e中apue.h的使用

    关于apue.3e中apue.h的使用 近来要学一遍APUE第三版,并于此开博做为记录. 先下载源文件: # url: http://http//www.apuebook.com/code3e.htm ...

  5. 游戏编程系列[2]--游戏编程中RPC与OpLog协议的结合--序

    在系列[1]中,我们展示了RPC调用协议的定义以及演示,通过方法定义以及协议约定,进行了协议约定以及调用过程的约定.然而,实际上在游戏中,调用过程之后,需要传输相对多的数据给服务端. 常用场景,客户端 ...

  6. 返回顶部的功能 div固定在页面位置不变

    1.你在网上搜索的时候,可能会搜索到div固定在页面上,不随滚动条滚动而滚动是用CSS写的,写法是position:fixed;bottom:0; 但是这个在iframe满地跑的页面实际开发中,有啥用 ...

  7. Handler系列之原理分析

    上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...

  8. C#字符串的倒序输出

    介绍 在本文中,我将演示如何将字符串的单词倒序输出.在这里我不是要将“John” 这样的字符串倒序为成“nhoJ”,.这是不一样的,因为它完全倒序了整个字符串.而以下代码将教你如何将“你 好 我是 缇 ...

  9. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  10. Java:泛型基础

    泛型 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚很多! 解决这种限制的 ...