Swift自定义下拉刷新、上拉加载(CZXRefresh的使用)

swift-SwiftFCXRefresh实现Swift常用的上下拉刷新功能都支持可自定义 SwiftFCXRefresh实现Swift常用的上下拉刷新功能都支持可自定义 立即下载

CZXRefresh

github项目地址

可以cocoapod导入

这里写图片描述

也可以下载之后手动导入

先把CZXRefresh.xcodeproj文件拖到项目下
这里写图片描述

然后配置项目文件
这里写图片描述

添加framework
这里写图片描述


使用方法

在需要使用的文件中import框架即可使用

import CZXRefresh

下拉刷新和上拉加载都可以在UITableView和UICollectionView中使用,以下以UITableView为例,UICollection用法相同。

添加默认的下拉刷新

tableView.czx_headerView = RefreshHeaderView(action: () -> ())
// or
tableView.czx_headerView = RefreshHeaderView(type: .default, action: () -> ())

添加默认的上拉加载

tableView.czx_footerView = RefreshFooterView(action: () -> ())
// or
tableView.czx_footerView = RefreshFooterView(type: .default, action: () -> ())

其中action参数可以直接使用闭包传值,也可以先定义函数再将函数传入
例如:

tableView.czx_headerView = RefreshHeaderView(type: .default, action: headerRefresh)
...
func headerRefresh() {
    DispatchQueue.global().async {
        print("-------------------------正在刷新 header")
        sleep(2)
        DispatchQueue.main.async {
            [weak self] in
            print("-------------------------刷新完成 header")
            self?.cellCount = 20
            self?.cellName = "刷新"
            self?.tableView.reloadData()
            self?.tableView.czx_headerView?.stopRefresh()
        }
    }
}

刷新完成、加载完成和加载完所有数据

当我们刷新的数据请求到之后,或者加载的数据加载完之后,我们需要调用相应的方法来收起刷新或暂停加载

self?.tableView.czx_headerView?.stopRefresh()  //刷新完成

self?.tableView.czx_footerView?.stopRefresh()  //加载完成
self?.tableView.czx_footerView?.endRefresh()  //加载完所有数据

使用示例如下:

func headerRefresh() {
    DispatchQueue.global().async {
        print("-------------------------正在刷新 header")
        sleep(2)
        DispatchQueue.main.async {
            [weak self] in
            print("-------------------------刷新完成 header")
            self?.cellCount = 20
            self?.cellName = "刷新"
            self?.tableView.reloadData()
            self?.tableView.czx_headerView?.stopRefresh()
        }
    }
}

...

func footerRefresh() {
    DispatchQueue.global().async {
        print("-------------------------正在加载 footer")
        sleep(2)
        DispatchQueue.main.async {
            [weak self] in
            print("-------------------------加载完成 footer")
            self?.cellCount += 20
            self?.tableView.reloadData()
            if self!.cellCount <= 40 {
                self?.tableView.czx_footerView?.stopRefresh()
            } else {
                print("-------------------------加载完所有数据 footer")
                self?.tableView.czx_footerView?.endRefresh()
            }
        }
    }
}

下拉刷新视图的几种类型

default类型(包含图片和文字,还有刷新时间)
这里写图片描述

imageAndText类型(包含图片和文字)
这里写图片描述

image类型(只有图片)
这里写图片描述

text类型(只有文字)
这里写图片描述

custom类型(用户自定义)

上拉加载视图的几种类型

default类型(包含图片和文字)
这里写图片描述

image类型(只包含图片)
这里写图片描述

text类型(只包含文字)
这里写图片描述

custom类型(用户自定义)

设置刷新视图高度和拖拽高度

默认的刷新视图和拖拽的距离是50,如果觉得不够的话,可以自己设置(需要在刷新视图或加载视图初始化之前设置)

//设置刷新视图高度
defaultHeaderHeight = 200
//设置刷新视图拖拽高度
defaultHeaderPullHeight = 70
//设置加载视图高度
defaultFooterHeight = 200
//设置加载视图拖拽高度
defaultFooterPullHeight = 70

设置刷新视图或加载视图的背景视图

可以自己定义喜欢的背景视图,例如UIImageView甚至是自定义的UIView,只要是UIView的子类都可以作为刷新和加载视图的背景视图

let imageView1 = UIImageView(image: UIImage(named: "22"))
let imageView2 = UIImageView(image: UIImage(named: "22"))

let header = RefreshHeaderView(type: .default, action: headerRefresh)
header.backgroundView = imageView1 //自定义背景视图
tableView.czx_headerView = header

let footer = RefreshFooterView(type: .default, action: footerRefresh)
footer.backgroundView = imageView2 //自定义背景视图
tableView.czx_footerView = footer

设置拖拽过程中是否自动改变透明度

默认都为true,也就是拖拽过程中随着拖拽距离的增加,透明度降低;如果为false,当开始拖拽时就是不透明的。

header.isAutoOpacity = true
footer.isAutoOpacity = false

设置是否自动刷新

header的该属性默认为false,也就是拖拽过程中有一个状态是提示松手开始刷新,如果设置为true,当拖拽到一定距离之后就直接开始刷新了

footer的该属性默认为true,也就是拖拽到一定距离直接开始刷新,如果设置为false,则加载视图会停留在底部,你可以点击加载或者上拉加载

header.isAutoRefresh = true
footer.isAutoRefresh = false

自定义下拉时图片位置的视图

为方便自定义,这里没有规定有图片的类型图片处必须使用UIImageView,只要是UIView都可以

let imageView = UIImageView(image: UIImage(named: "11"))
header.normalView = imageView

此处normalView为UIView类型

同时也可以自己定义下拉时的动画

header.setpullingAnimation { (view, percent) in
    view.alpha = percent
}

此处设置动画时需要传入一个参数为UIView和CGFloat的闭包,此处的view为刚刚设置的视图,percent为下拉的距离与拖拽高度的百分比。

自定义松手开始刷新时图片位置的视图

定义方法类似以上定义下拉时的视图和动画,就直接贴代码了

header.releaseToRefreshView = imageView
header.setReleaseToRefreshAnimation { (view) in
    UIView.animate(withDuration: 0.5, animations: {
        view.alpha = 0.2
    })
}

自定义刷新时图片位置的视图

定义方式也同样类似

header.refreshingView = imageView
header.setRefreshingAnimation { (view) in
    UIView.animate(withDuration: 0.3, delay: 0, options: [.repeat, .autoreverse], animations: {
        view.alpha = 0.2
    }, completion: nil)
}

自定义刷新完成时的图片位置的视图

header.refreshedView = imageView

刷新完成时不提供自定义动画

自定义上拉时图片位置的视图

上拉加载自定义图片位置的视图也可以像下拉刷新那样自定哦

let imageView = UIImageView(image: UIImage(named: "11"))
footer.staticView = imageView
footer.setPullingAnimation { (view, percent) in
    view.alpha = percent
}

view为添加的自定义上拉时的视图,percent为上拉的距离与上拉加载高度的百分比

自定义加载时图片位置的视图

footer.dynamicView = imageView
footer.setDynamicAnimation { (view) in
    UIView.animate(withDuration: 0.3, delay: 0, options: [.repeat, .autoreverse], animations: {
        view.alpha = 0.2
    }, completion: nil)
}

自定义数据加载完时图片位置的视图

footer.endView = imageView

加载结束的自定义动画不提供

纯用户自定义下拉刷新

如果你觉得,以上下拉刷新的四种布局你都不喜欢的话,好,咱们来自己定义

首先,你需要遵循CustomHeaderRefreshDelegate协议,并实现其中的七个方法(四个分别用于设置下拉时的视图、松手开始刷新时的视图、刷新时的视图、刷新完成的视图,三个分别用于设置下拉时的动画、松手开始刷新时的动画、刷新时的动画)

然后你需要设置刷新时的代理,示例代码如下:
这里写图片描述

let header = RefreshHeaderView(type: .custom, action: headerRefresh)
tableView.czx_headerView = header
tableView.czx_headerView?.delegate = self  //也可以使用header.delegate = self

......

func setNormalView() -> UIView {
    let image = UIImage(named: "1")
    let imageView = UIImageView(image: image!)
    return imageView
}

func setReleaseToRefreshView() -> UIView {
    let image = UIImage(named: "2")
    let imageView = UIImageView(image: image!)
    return imageView
}

func setRefreshingView() -> UIView {
    let image = UIImage(named: "3")
    let imageView = UIImageView(image: image!)
    return imageView
}

func setRefreshedView() -> UIView {
    let image = UIImage(named: "22")
    let imageView = UIImageView(image: image!)
    return imageView
}

func setPullingAnimation(view: UIView, percent: CGFloat) {
    view.alpha = percent
}

func setReleaseToRefreshAnimation(view: UIView) {
    UIView.animate(withDuration: 0.3) {
        view.transform = view.transform.rotated(by: CGFloat.pi)
    }
}

func setRefreshingAnimation(view: UIView) {
    UIView.animate(withDuration: 0.2, delay: 0, options: [.repeat, .autoreverse], animations: {
        view.alpha = 0.2
    }, completion: nil)
}

纯用户自定义上拉加载

如果你觉得,以上上拉加载的三种布局你也都不喜欢的话,好,咱们也可以来自己定义

首先,你需要遵循CustomFooterRefreshDelegate协议,并实现其中的五个方法(三个分别用于设置上拉时的视图、加载时的视图、加载完成的视图,两个分别用于设置上拉时的动画、加载时的动画)

然后你需要设置加载时的代理,示例代码如下:
这里写图片描述

let footer = RefreshFooterView(type: .custom, action: footerRefresh)
tableView.czx_footerView = footer
tableView.czx_footerView?.delegate = self  //也可以使用footer.delegate = self

......

func setNormalView() -> UIView {
    let image = UIImage(named: "1")
    let imageView = UIImageView(image: image!)
    return imageView
}

func setRefreshingView() -> UIView {
    let image = UIImage(named: "2")
    let imageView = UIImageView(image: image!)
    return imageView
}

func setEndRefreshView() -> UIView {
    let image = UIImage(named: "3")
    let imageView = UIImageView(image: image!)
    return imageView
}

func setPullingAnimation(view: UIView, percent: CGFloat) {
    view.alpha = percent
}

func setRefreshingAnimation(view: UIView) {
    UIView.animate(withDuration: 0.2, delay: 0, options: [.repeat, .autoreverse], animations: {
        view.alpha = 0.2
    }, completion: nil)
}
ios swift 上拉加载、下拉刷新数据 swift写的上拉加载、下拉刷新,支持继承uiscrollview的控件(uitableview,uicollectionview),修复在Xcode6.4 的bug 立即下载

相关推荐

医疗器械软件测试输出内容(1)

*单元测试(Unit Testing):**单元测试是软件测试的最底层,用于验证软件中最小的可测试单元——函数、方法或模块。系统测试是在集成测试之后进行的,它对整个系统进行测试,验证系统在不同部分集成在一起后是否满足需求和规格。: 集成测试是在单元测试之后进行的,它关注不同单元之间的交互和集成。对于不同安全级别的软件(IEC 62304 A类、B类、C类),在体系上要求输出的文件内容有所区别。**说明:**将集成测试和软件系统测试合并为一项单一的计划和一组活动是可接收的。

ct745363083的博客 1867

[SwiftUI]ScrollView下拉刷新与上拉加载

自己写有点费时间,要自定的话可以参考一下@心猿意码 老兄封装的。虽然刷新时机还有待优化,但确实很简洁,比较适合我的开发习惯。用现成的工具就很香了。

Gamin 5237

Gazebo仿真UUV水下机器人:从环境搭建到避障算法实战

本文详细介绍了使用Gazebo仿真平台进行UUV水下机器人开发的全流程,涵盖从环境搭建、uuv_simulator配置、传感器集成到核心避障算法实战。通过搭建水下仿真实验室并实现基于激光雷达数据的反应式避障算法,为水下机器人算法验证与开发提供了高效、低成本的解决方案。

weixin_28840591的博客 263

【亲测免费】 推荐开源项目:SwiftUI-Refresh —— 为你的SwiftUI应用添加原生下拉刷新功能

推荐开源项目:SwiftUI-Refresh —— 为你的SwiftUI应用添加原生下拉刷新功能 项目介绍 SwiftUI-Refresh 是一个由 @ldiqual 维护的开源库,专为SwiftUI开发者设计,旨在提供一种简单的方法在List视图中实现原生的Pull To Refresh功能。通过深入探索视图层次结构,它能找到对应的 UITableView 并添加 UIRefreshContro...

gitblog_00036的博客 1391

双参数威布尔分布(Weibull分布)参数计算(根据故障数据,求双参数威布尔分布的参数详细步骤)

根据故障数据求威布尔分布参数步骤 根据众多文献研究,设备故障数据大多服从指数分布、威布尔分布或对数正态分布。其中威布尔分布较为常用,本文主要介绍威布尔分布的简单应用,并根据某设备故障数据为例简单介绍威布尔分布参数的计算方法。 参考文献11参考文献22 1.双参数威布尔分布的概率密度函数、概率分布函数、可靠度函数: 2.预处理故障数据 将故障数据按时间排序,假设设备分别在以下时间点失效:11.1 、23.5、58.4……则将此时间从小到大排序。并计算中位秩。中位秩的计算公式如下: 其中i表示第几个数据,n

biaochengxiaobai的博客 4万+

手把手教你用RV1103+SC3336摄像头DIY一个离线人脸门禁原型

本文详细介绍了如何利用RV1103芯片和SC3336摄像头构建离线人脸门禁系统。从硬件选型到算法优化,再到业务逻辑实现,提供了完整的DIY指南。重点讲解了RetinaFace和FaceNet算法在嵌入式系统中的移植与调优,帮助开发者快速实现高效、隐私安全的门禁解决方案。

weixin_26905487的博客 509

SwiftUI:下拉刷新的实现

由于目前swiftui未提供Scrollview的实现,我在网上找到了一个swiftuiLab出得代码,利用滚动偏移实现的下拉刷新。 // Authoer: The SwiftUI Lab // Full article: https://swiftui-lab.com/scrollview-pull-to-refresh/ import SwiftUI import Foundation struct RefreshableScrollView<Content: View>: V.

2090

Fast DDS源代码走读

DDS, PDP, EPD, DataWriter, DataReader

weixin_43082062的博客 713

SwiftUI 中级之下拉更新PullRefresh (2020年教程)

SwiftUI 中级之下拉更新PullRefresh (2020年教程) 将之前等代码封装成struct import SwiftUI public struct PullToRefresh: UIViewRepresentable { let action: () -> Void @Binding var isShowing: Bool ...

iCloudEnd的博客 990

杭电计算机组成原理课程设计-实验七-寄存器堆设计实验

寄存器堆实验实验原理实验内容模块功能说明模块逻辑引脚图寄存器堆模块代码REG模块测试用例REG-ALU测试用例实验结果记录 寄存器堆实验结果及分析ALU_REG运算器模块实验结果及分析探索与思考 实验原理   32×32位的寄存器堆模块示意图如图所示,含有32个寄存器,每个寄存器32位。该寄存器堆具有A和B两个读端口,分别由 5 位的寄存器编号 R_Addr_A 和 R_Addr_B 来寻址 2 个寄存器,读出的数据则由 R_Data_A(32 位)和R_Data_B(32 位)输出。读访问时,没有使能或者

HDU-整蛊小子-⏰☂️/蚂蚁集团研发工程师 1万+

【74HC595芯片】核心驱动代码

74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。

weixin_67147824的博客 1847

【亲测免费】 SwiftPullToRefresh: 简洁而强大的Swift下拉刷新库

SwiftPullToRefresh: 简洁而强大的Swift下拉刷新库 是一个为iOS开发者量身打造的轻量级下拉刷新框架,它采用纯Swift编写,易于集成,并提供了丰富的自定义选项,让您的应用在刷新交互上更具个性化。 项目概述 SwiftPullToRefresh致力于简化iOS应用中常见的下拉刷新功能的实现。通过简单的API调用,您可以在任何需要的地方添加下拉刷新效果,无论是UITableVi...

gitblog_00021的博客 761

《FreeRTOS 入门与实战》第20章:移植到 RISC-V 平台

处理器上下文保存/恢复机制中断处理与任务切换的协同时钟源配置(通常使用 Machine Timer)平台特定的汇编代码实现// 典型RISC-V移植文件结构FreeRTOS/├── Source/portable/[编译器]/RISC-V/│ ├── port.c // 关键移植接口│ ├── portASM.s // 汇编级处理│ └── portmacro.h // 架构宏定义。

2301_79143213的博客 448

【亲测免费】 SwiftUI-Refresh 技术文档

SwiftUI-Refresh 技术文档 1. 安装指南 1.1 Swift Package Manager (SwiftPM) 使用 Swift Package Manager 安装 SwiftUI-Refresh 非常简单。只需在 Xcode 项目中添加以下依赖项: https://github.com/timbersoftware/SwiftUIRefresh.git 1.2 Cocoap...

gitblog_01294的博客 915

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

开源项目指南:SwiftUI-Refresh —— 为SwiftUI应用注入原生下拉刷新能力

开源项目指南:SwiftUI-Refresh —— 为SwiftUI应用注入原生下拉刷新能力 项目介绍 SwiftUI-Refresh是由@ldiqual维护的一款开源库,专门针对SwiftUI开发者打造。该库旨在简化在List视图中集成Pull To Refresh(下拉刷新)功能的过程。通过智能检测视图层级中的UITableView并添加UIRefreshControl,SwiftUI-Ref...

gitblog_00654的博客 1031

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

推荐项目:SwiftUIPullToRefresh - 让刷新如丝般顺滑

推荐项目:SwiftUIPullToRefresh - 让刷新如丝般顺滑 swiftui-pull-to-refreshPull to refresh functionality for any ScrollView in SwiftUI!项目地址:https://gitcode.com/gh_mirrors/sw/swiftui-pull-to-refresh 在当今的移动应用开发领域,Swi...

gitblog_00032的博客 600

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SwiftUI 的 refreshable 修饰符:优雅实现下拉刷新

在 iOS 应用中,“下拉刷新”是一种常见的交互模式。而在 SwiftUI 中,从 iOS 15 开始,Apple 提供了一个原生支持的修饰符 —— refreshable。

郭永明的技术专栏 908

IOS Demo -下拉刷新实践(Swift)

Demo环境:IOS 15,Xcode 13, swift。

下半年记忆的博客 1391

Swift中TableView的下拉刷新和上拉加载

本章中,你会学会TableView是如何进行下拉刷新和上拉加载

王偃飞的博客 1301

LZ4元数据详解:掌握xxHash校验与内容尺寸管理的高效压缩技巧

LZ4作为一款极速压缩算法,其强大性能不仅体现在压缩速度上,更在于其完善的元数据管理系统。本文将深入解析LZ4帧格式中的xxHash校验机制和内容尺寸管理功能,帮助您全面掌握这一高效压缩工具的核心技术。💪 ## 🔍 什么是LZ4元数据? LZ4元数据是压缩帧中用于管理和验证数据完整性的关键信息。在[lib/lz4frame.h](https://link.gitcode.com/i/8f5

gitblog_00808的博客 729

SwiftUIRefresh安装与配置完全指南

SwiftUIRefresh安装与配置完全指南 项目基础介绍与主要编程语言 SwiftUIRefresh 是一个专为 SwiftUI 设计的开源库,它解决了在 SwiftUI 的列表(List)视图中实现原生下拉刷新(Pull To Refresh)功能的需求。通过智能地遍历视图层级来定位底层的 UITableView,并在其上添加 UIRefreshControl,从而带来与 UIKit 应用相...

gitblog_01285的博客 1235

推荐文章:刷新你的视野——SwiftUI下的Refresh开源项目

在追求流畅用户体验的移动应用开发领域,一个高效且优雅的下拉刷新和加载更多解决方案,几乎是每个开发者梦寐以求的宝藏。今天,就让我们一起探索由@wxxsw带来的开源项目——**Refresh**,它不仅仅是一个工具库,更是一次对SwiftUI潜力的深度挖掘。 ## 项目介绍 Refresh,正如其名,为你的iOS应用注入新鲜活力。专为SwiftUI量身打造,无需繁琐的`UIViewRepresen

gitblog_00513的博客 978

开源项目推荐:SwiftUI-Refresh —— 让你的SwiftUI应用焕发新生!

开源项目推荐:SwiftUI-Refresh —— 让你的SwiftUI应用焕发新生! 项目介绍 在iOS开发的道路上,我们总免不了与各种列表和刷新机制打交道。而SwiftUI的诞生无疑为我们的界面设计带来了革命性的改变。然而,在原生的SwiftUI中,实现下拉刷新这一基础功能却显得有些不足。今天,我要向大家隆重介绍一款强大的开源库——SwiftUI-Refresh,它将为你带来便捷且高效的Pul...

gitblog_00385的博客 818

BTT Touch Bar预设终极性能优化指南:如何减少Mac系统资源消耗

如果你正在使用BetterTouchTool(BTT)Touch Bar预设,但发现Mac电脑变得缓慢或电池续航缩短,那么这篇文章正是为你准备的!BTT Touch Bar预设是提升MacBook Pro用户体验的强大工具,但不当配置可能导致系统资源过度消耗。本文将为你揭示如何优化BTT预设性能,让你的Touch Bar既实用又高效。😊 ## 📊 BTT Touch Bar预设性能问题诊断

gitblog_01290的博客 740

SwiftUI-PullToRefresh 项目常见问题解决方案

SwiftUI-PullToRefresh 项目常见问题解决方案 1. 项目基础介绍和主要编程语言 SwiftUI-PullToRefresh 是一个开源项目,它提供了一个在 SwiftUI 中为 List 和 NavigationView 实现“下拉刷新”功能的方法。这个功能在许多应用中非常常见,可以增强用户体验。项目主要使用 Swift 语言编写,适用于 iOS 13 及以上版本,并且需要在 ...

gitblog_00408的博客 413

自定义下拉刷新控件 - RefreshableView(支持所有控件的下拉刷新)

这是在了解下拉刷新功能原理下的产物,下拉刷新可以说是国产APP里面必有的功能,连Google都为此出了SwipeRefreshLayout,一种MD风格的下拉刷新。 不过,MD风格在国内似乎很是艰难,不单单是国内系统主流仍是4.4的原因,也有用户习惯的问题,扯的有点多了,在看了许多博客之后,我突然想写一个能仿照 SwipeRefreshLayout 的兼容所有控件的下拉刷新,不单单只是 ListV

jiahuan 1183
上一篇: framework和cocoapod加载图片问题
下一篇: Swift使用极光推送JPush的Demo
麻豆_matou
博客等级 码龄10年 41粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值