iOS一句代码搞定下拉刷新和上拉加载更多

【ios】navigationController使用和页面跳转后数据刷新 本博文主要是对ios中navigationController使用和页面跳转后数据刷新需求实现的一个介绍,以及记录,方便后续使用时候可以直接加载,这边ios开发主要使用语言Objective-C。iOS中的navigationController是UIKit框架中提供的一个容器视图控制器,用于实现导航堆栈的管理和界面之间的转场。navigationController是一个栈结构,每个视图控制器在navigationController中都有自己的位置。 阅读详情

现在的iOS刷新控件层出不穷,但是想找到一个样式完全符合自己基本没有,所以利用空余时间自己实现了一个刷新的控件,通过一个demo来搞明白其中的原理。
先来个效果图
在这里插入图片描述

大概说一下设计思路,在scrollView的顶部和底部分别添加headerView和footView。通过KVO来监听scrollView的contentOffset、contentSize、bounds这个三个属性,根据contentOffset的改变来显示headerView和footView,监听contentSize的目的是让footView一直保持在最底部,监听bounds的作用是刷新headerView和footView的frame。
headerView和footView呈现的内容则是通过refreshState这个状态的改变分别显示不同的内容。代码如下

    override var refreshState: RefreshState? {
        willSet {
            tipsLabel?.isHidden = false
            loadingView?.isHidden = true
            if newValue == .Ready  {
                tipsLabel?.text = "下拉刷新"
            }else if newValue == .WillRefresh  {
                tipsLabel?.text = "松开立即刷新"
            }else if newValue == .Refreshing {
                tipsLabel?.isHidden = true
                loadingView?.isHidden = false
            }else {
                tipsLabel?.text = "刷新完成"
            }
        }
    }

核心代码,通过KVO监听属性的改变

    /// KVO监听contentOffset的变化
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == RefreshView.contentOffsetKeyPath {
            if canRefresh == true && self.scrollView!.isDragging == false {
                if self.refreshState == .WillRefresh {
                    //松手进入刷新状态
                    self.refreshState = .Refreshing
                    if self.refresh != nil {
                        self.refresh!()
                    }
                    UIView.animate(withDuration: 0.5) {
                        self.scrollView?.contentInset.top = self.frame.size.height
                    }
                }
            }
            
            if self.scrollView!.isDragging == true {
                if self.refreshState != .Refreshing && self.refreshState != .Refreshed {
                    //非刷新状态下拖拽scrollView
                    if self.scrollView!.contentOffset.y <= -(self.frame.size.height  + 5) {
                        self.refreshState = .WillRefresh
                        self.canRefresh = true
                    }else {
                        self.refreshState = .Ready
                        self.canRefresh = false
                    }
                }
                
            }
        }else if keyPath == RefreshView.boundsKeyPath {
            //scrollView的bound发生改变
            let newValue: CGRect = change?[NSKeyValueChangeKey.newKey] as? CGRect ?? .zero
            let oleValue: CGRect = change?[NSKeyValueChangeKey.oldKey] as? CGRect ?? .zero
            if newValue.size.width != oleValue.size.width {
                self.frame.size.width = newValue.size.width
            }
        }
    }

使用,一句代码搞定

  • 刷新操作
        self.tableView.refreshHeaderView {
            //这里进行刷新操作
        }
        //结束刷新,如果处于没有更多数据状态下将自动重置
        self.tableView.refreshHeaderView?.endRefresh()
  • 加载更多操作
        self.tableView.refreshFootView {
            //这里进行加载更多操作
        }
        //结束加载更多
        self.tableView.refreshFootView?.endRefresh()
        
        //如果服务器没有更多数据返回,可以使用这个方法
        self.tableView.refreshFootView?.noMoreData()

最后附上demo

IOS上拉刷新及自动加载更多,不需要上拉加载更多, IOS上拉刷新及自动加载更多,不需要上拉加载更多,直接就翻到下面就自动加载更多! 喜欢的话到我博客留个言吧,感谢:http://blog.youkuaiyun.com/xiaoyuan511 新手,大神勿喷。求共同进步! 立即下载

相关推荐

iOS上拉加载更多的实现

通过向上拉动,来实现加载更多的数据。向下拉的时候刷新页面。

IM 聊天页面下拉加载更多--类似微信顺滑展示

类似微信聊天页面,加载更多数据之后不回弹,新旧数据无缝衔接,顺滑展示

mazhanwen10的专栏 1477

51单片机基础知识

前言 周末闲着无聊,以后定时更新一期关于51单片机的学习案例,以供大家平时参考使用。至于单片机,你可以理解为人的大脑,而人各项身体器官的运作需要意识给到大脑,然后大脑再驱动我们的中枢神经进行相应的动作,这里的意识可以理解为我们要写的程序,而人的器官相当于各种输出设备,例如我们以后要学的LED、电机、各种传感器等等。学好单片机能让你找到一份相对不错的工作,当然越可观的东西也是要付出相应努力的。 一、51单片机是什么? 通常我们一说到 51 单片机,指的都是兼容IntelMCS-51体系架构的一系列单片机,而

qq_43537819的博客 6905

iOS 回到主线程刷新UI

NSThread、CGD和NSOperation 找到主线程的方法,iOS 主线程刷新UI

wyz670083956的博客 1704

避坑指南:AUTOSAR FlashDriver操作DFlash模拟EEPROM时,你最容易忽略的5个细节

本文深入探讨了AUTOSAR FlashDriver在DFlash模拟EEPROM操作中最容易被忽视的五大细节问题,包括地址合法性检查、操作时序控制、并发访问冲突、电源稳定性管理和寿命管理。通过实际项目案例和工程化解决方案,帮助开发者避免常见陷阱,提升汽车电子控制单元(ECU)的可靠性和稳定性。

weixin_42741930的博客 247

从一只龙虾到一支团队:OpenClaw 单 Bot 多 Agent 配置实践

单 Bot 多 Agent只有一个对外的聊天入口(飞书 Bot)内部有多个独立的 AI Agent,各司其职主 Agent(总指挥)负责接收任务并分配给子 Agent子 Agent 完成任务后将结果返回给主 Agent角色Agent ID职责使用场景🎯 总指挥main-agent统筹协调,任务分发接收所有用户请求✍️ 笔杆子内容创作公众号、博客、小红书🔬 参谋canmou深度研究竞品分析、市场调研📋 运营官operations运营管理邮件、日历、社交媒体。

Maynor的博客 1082

iOS 刷新常用代码

合理的刷新获取数据对系统流畅性等性能十分重要.而且,刷新数据这个操作很常见,记录下来.   -(void)addMJRefresh{ __unsafe_unretained UITableView *tableView = self.table; __weak ViewController *selfView = self; // 下拉刷新 tableView...

时光的博客 525

Android 12.0 SystemUI下拉状态栏定制化之隐藏下拉通知栏布局功能实现(二)

在12.0的系统定制化开发中,由于从12.0开始SystemUI下拉状态栏和11.0的变化比较大,所以可以说需要从新分析相关的SystemUI的 布局,然后做分析来实现不同的功能,今天就开始实现关于隐藏SystemUI下拉状态栏中的通知栏布局系列二,去掉下拉状态栏中 通知栏部分 白色的圆角背景

安卓兼职framework和app工程师的博客 1636

iOS中的下拉刷新SVPullToRefresh

下拉刷新是一种利用手势刷新用户界面的功能,虽然已经被Twitter申请为专利,但依然不能阻止广大的App开发者在自己的应用中加入该功能。苹果公司甚至在iOS6的sdk中加入了UIRefreshControl,从而实现了系统级的下拉刷新。但是UIRefreshControl是绑定在UITableViewController上的,所以灵活性不高。 如果在网上搜下拉刷新的实现,讨论最多的恐怕是EGOT

iTenric的专栏 1万+

线性代数 --- 置换矩阵 (Permutation matrix)

置换矩阵 - permutation matrix

松下J27录放机 3万+

OpenHarmony + AI:深度解析 Whisper.cpp 智慧语音系统级移植与 NAPI 封装实战

【代码】OpenHarmony + AI:深度解析 Whisper.cpp 智慧语音系统级移植与 NAPI 封装实战。

m0_67505153的博客 188

ZHRefresh一行代码搞定上拉加载,下拉刷新(Swift version)

try your best ZHRefresh Swift版的刷新控件,MJRefresh基于swift重写. MyZone My blog My github url ZHRefresh Contents swift版的下拉刷新框架, 一行代码搞定上拉加载, 下拉刷新. 开始使用 支持哪些控件刷新 如何安装 类结构 常见API ZHRefreshC...

流星雨的博客 625

对接金蝶云星空调用即时库存信息查询API(附JAVA实现)

这篇文章教你如何对接金蝶API并且使用JAVA调用金蝶云星空的即时库存查询API

实用的博客 2609

android:ListView下拉刷新上拉加载更多(PullToRefresh框架抽取)

其实谷歌官方目前已经推出ListView下拉刷新框架SwipeRefreshLayout,想了解的朋友可以点击http://blog.youkuaiyun.com/fan7983377/article/details/51333070了解一下; 大家不难发现当你使用SwipeRefreshLayout下拉的时候布局文件不会跟着手势往下滑,而且想要更改这个缺陷好像非常不容易。 虽然SwipeRefres

Zheng 5259

Ubuntu零基础教学-如何把Ubuntu20.04界面从英文修改为中文?| 超级详细,建议收藏

带你如何把Ubuntu20.04界面从英文修改为中文?| 超级详细,建议收藏

**My Coding Family** 5340

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

《ReactNative》之ListView上拉下拉刷新

1.上拉下拉刷新的思路 2.Android支持gif图片 3.效果截图 4.完整的代码

北海之灵的博客 1286

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

douyin-ios-swift 自定义控件完全清单:下拉刷新、加载更多、环形进度条等 4 大可复用 Swift 组件详解

[![douyin-ios-swift 视频列表加载界面中的自定义控件效果](https://raw.gitcode.com/gh_mirrors/do/douyin-ios-swift/raw/85d264c262e9a1432ebff16b597953d9e44d0763/Douyin/Resource/Assets.xcassets/img_video_loading.imageset/im

gitblog_00025的博客 450

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

下拉刷新

一.上拉刷新 1.为什么要做上拉刷新? 想要看一些旧的(更多)数据,就需要上拉刷新,加载更多数据 2.上拉刷新永远都显示在tableView最底部,用什么搭建? tableFootView永远在tableView最底部,可以用它来搭建 3.上拉刷新业务逻辑 3.1当上拉刷新控件(footView)全部显示的时候,加载更多数据 3.2界面搭建 用xib根据自己需要搭建想要

a36268716的博客 370

自个儿写Android的下拉刷新/上拉加载控件 (续)

本文算是对之前的一篇博文《自个儿写Android的下拉刷新/上拉加载控件》的续章,如果有兴趣了解更多的朋友可以先看一看之前的这篇博客。事实上之所以会有之前的那篇博文的出现,是起因于前段时间自己在写一个练手的App时很快就遇到这种需求。其实我们可以发现类似这样下拉刷新、上拉加载的功能正在变得越来越普遍,可以说如今基本上绝大多数的应用里面都会使用到。当然,随着Android的发展,已经有不少现成的可以实

LaterEqualsNever 3714

终极解决方案:MJRefresh 下拉刷新后如何自动滚动到顶部

MJRefresh 是一款广泛使用的 iOS 下拉刷新框架,它为 UIScrollView 及其子类(如 UITableView、UICollectionView)提供了便捷的下拉刷新、上拉加载更多功能。本文将详细介绍如何在使用 MJRefresh 实现下拉刷新后,让列表自动滚动到顶部,提升用户体验。 [![MJRefresh 框架 logo](https://raw.gitcode.com/g

gitblog_00506的博客 996

ios mvvm框架的封装_iOS MVVM+RAC 从框架到实战

〇、更新针对最后一小节中干掉基类的做法(Runtime + category),已经有所实现,并按照自己的思路新写了个列表实现,具体可查看对于iOS架构模式之争的一些思考。一、前言很早之前就想写写自己在架构模式方面的心得,但是一直感觉自己是井底之蛙,毕竟在iOS领域越深入越感到自己的无知,心中有着敬畏之心,就更没有自信去写这个东西(你也可以理解是没时间(>﹏<),请原谅我的装逼,嘿嘿).对于架构模...

weixin_35419195的博客 592

iOS, PullTableView实现下拉刷新,上拉加载数据

先倒入包 窝门现在要用的是pulltableview这个类就可以了  这个类中本身就是一个tableview, 完全可以把他当作一个tableview来是用,在.h一样要加上tableview的协议;   现在说一些特别的地方的哈  @interface ChanelTudou : UIViewControllerUITableViewDataSource,UITa

u010698385的专栏 2398

一个类搞定UIScrollView那些事

前言 UIScrollView可以说是我们在日常编程中使用频率最多、扩展性最好的一个类,根据不同的需求和设计,我们都能玩出花来,当然有一些需求是大部分应用通用的,今天就聊一下以下需求,在一个category中统统搞定: 1下拉刷新:支持下拉过程中GIF逐帧,loading时可自定义帧率 2上拉更多:支持GIF,支持提前加载,滚动到最后能替换图片作为提示 3回到顶部:当滚动多屏之后,往回划时...

weixin_30849403的博客 80

iOS小技巧-MJRefresh简单整合

一个开源简单易用可上下拉刷新的开源框架。 下载MJRefresh的开源包; 将开源包导入自己的项目。 此时可能会出现错误,objc_msgSend(self.beginRefreshingTaget, self.beginRefreshingAction, self); 别急! 进入project界面,点击TARGETS下的项目名->build Settings->搜索"EN

z548888240的专栏 1166

iOS MVVM+RAC 从框架到实战

一、前言 二、谈谈MVVM和RAC 1、MVVM浅析 2、RAC浅浅析 3、本篇对两者的理解运用 二、框架部分 1、框架目录详解 2、基类详解 3、题外话 三、实战部分(经典列表的实现) 1、LSCircleListViewController的处理 2、View的处理 3、LSCircleListModel的处理 4、ViewModel的处理 5、APPDelegat

努力,可能成功!放弃,注定失败! 5742
上一篇: iOS按钮超出父控件部分任能响应点击事件和扩大/缩小响应范围
下一篇: iOS之load和initialize方法详解
菜鸟的向往
博客等级 码龄10年 1粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值