关于Swift集成Alamofire/Kingfisher/MJRefresh/MBProgressHUD的小项目和swift集群的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于(Swif
关于Swift 集成Alamofire/Kingfisher/MJRefresh/MBProgressHUD的小项目和swift集群的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于(SwiftUI) Kingfisher ForEach 问题、Github每日精选(第28期):Swift图像下载库 Kingfisher、iOS MJRefresh 下拉刷新 上拉加载(可添加 gif 图版) 小结、iOS MJRefresh 的使用方式等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- Swift 集成Alamofire/Kingfisher/MJRefresh/MBProgressHUD的小项目(swift集群)
- (SwiftUI) Kingfisher ForEach 问题
- Github每日精选(第28期):Swift图像下载库 Kingfisher
- iOS MJRefresh 下拉刷新 上拉加载(可添加 gif 图版) 小结
- iOS MJRefresh 的使用方式
Swift 集成Alamofire/Kingfisher/MJRefresh/MBProgressHUD的小项目(swift集群)
前些时做的Swift版本的瀑布流的Demo《Swift UITableView瀑布流/NSURLConnection异步网络请求》时,使用的是NSURLConnection做的网络异步请求,图片的异步加载使用的是GCD做的。在使用的过程中,网络请求部分是没有什么问题的,但是在图片的异步加载时,由于图片没有缓存,所以在上下滑动的时候,需要不断的加载图片,所以用户体验不好。
在OC中,我们有AFNetworking和SDWebimage做网络的加载和图片的加载。那么在Swift中也是有类似的:Alamofire和Kingfisher。前者是网络加载,后者是图片加载。在使用的过程中使用的是CocoaPods集成进来的。关于CocoaPods的集成可以移步《iOS 开发CocoaPods的使用》。
于是在做这个小的Swift的项目中,一共集成了四个第三方库:Alamofire/Kingfisher/MJRefresh/MBProgressHUD。
关于Alamofire/Kingfisher/MJRefresh的集成,按照这个三个第三库上面的CocoaPods方法集成就可以,可以看看Podfile文件里面的内容:
source 'https://github.com/CocoaPods/Specs.git' platform :ios,'9.0' use_frameworks! pod 'Alamofire','~> 3.3' source 'https://github.com/CocoaPods/Specs.git' platform :ios,'8.0' use_frameworks! pod 'Kingfisher','~> 2.4' pod 'MJRefresh' use_frameworks!
但是集成MBProgressHUD就需要手动拖拽集成了。我们把MBProgressHUD的.m和.h文件拖拽进来后,提示我们新建一个Swift和OC的桥接文件,可看看《Swift Swift和OC混编》,我们把
#import "MBProgressHUD.h"
放在桥接文件就可以使用MBProgressHUD了。
关于上面的四个第三方库,可以查看GitHub或是百度就可以了。
先看看这个项目的效果图:
使用的API是showAPI上面的微信大全。
初始化视图:
func initView() { self.tableView.registerNib(UINib(nibName: "WXTableViewCell",bundle:nil),forCellReuseIdentifier: "WXTableViewCell") // 添加下拉刷新 self.tableView.mj_header = MJRefreshnormalHeader(refreshingTarget: self,refreshingAction: #selector(ViewController.headRefresh)) // 添加上拉加载更多 self.tableView.mj_footer = MJRefreshAutonormalFooter(refreshingTarget: self,refreshingAction: #selector(ViewController.addMoreData)) }
视图使用的IB拉的。
Alamofire网络请求部分:
// MARK: 网络请求 /** 网络请求 - parameter pageIndex: 页数 */ func requestData(pageIndex: String){ self.showHUD() // 设置请求参数 let showapi_timestamp = self.getDatastr() let parameters = [ "key": "","showapi_appid": showapi_appid,"showapi_sign": showapi_sign,"page": pageIndex,"showapi_timestamp": showapi_timestamp,] Alamofire.request(.GET,baseUrl,parameters: parameters).responseJSON {response in switch response.result{ case .Success(let dice): self.hideHUD() let dice1 = dice["showapi_res_body"] as! NSDictionary let dice2 = dice1["pagebean"] as! NSDictionary self.allPages = dice2["allPages"] as! NSNumber let contentlist = dice2["contentlist"] as! NSArray // 下拉刷新 数组清空 if pageIndex == "1"{ self.dataArray.removeAllObjects() } for dataDice in contentlist{ let model = DataModel() // 数据转模型 添加进数组 self.dataArray.addobject(model.makeDataModel(dataDice as! NSDictionary)) } self.flag = 2 self.tableView.reloadData() // 刷新完成 结束上下拉 self.tableView.mj_header.endRefreshing() self.tableView.mj_footer.endRefreshing() case .Failure(let error): print(error) self.hideHUD() } } }
获取当前时间:
/** 获取当前时间 - returns: 当前时间 */ func getDatastr() -> String{ let date1 = NSDate() let dataFormat = NSDateFormatter.init() // yyyyMMddHHmmss dataFormat.dateFormat = "yyyyMMddHHmmss" let dataString = dataFormat.stringFromDate(date1) as String return dataString }
实现上下拉方法:
// MARK: 上下拉 /** 下拉刷新 */ func headRefresh() { self.requestData("1") } /** 上拉加载更多 */ func addMoreData() { self.currentPage = self.currentPage + 1 if self.currentPage < self.allPages.integerValue { let page = String(self.currentPage) self .requestData(page) } }
MBProgressHUD的使用:
// MARK: 菊花 func showHUD() { let hud = MBProgressHUD.showHUDAddedTo(self.view,animated: true) hud.mode = MBProgressHUDMode.Indeterminate hud.labelText = "数据加载中……" hud.dimBackground = true } func hideHUD() { MBProgressHUD.hideAllHUDsForView(self.view,animated: true) }
Kingfisher的使用
在使用Kingfisher是比较简单的使用。主要实在给cell填充数据时使用。
/** 给cell填充数据 - parameter dataArray: 数据集合 - parameter indexPath: indexPath */ func fillCellWiftDataArray(dataArray :NSArray,indexPath: NSIndexPath){ let model = dataArray[indexPath.row] as! DataModel self.userImageView.kf_setimageWithURL(NSURL(string: model.userlogo)!) self.userNameLabel.text = model.userName self.timerLabel.text = model.date; self.mainImageView.kf_setimageWithURL(NSURL(string: model.contentImg)!) self.contentLabel.text = model.title self.typeLabel.text = model.typeName }
基本四个第三方库
Alamofire/Kingfisher/MJRefresh/MBProgressHUD的简单使用基本就是这样的。
总结
在这个小的项目中,看起来只有两个页面,但是我们学会了怎么集成Alamofire/Kingfisher/MJRefresh/MBProgressHUD和使用,CocoaPods的使用,Swift和OC的混编。
但是还有需要改善的,比如可以把MBProgressHUD再封装一下的,这样使用起来就更加方便了;可以新建一个.pch文件,把需要在多个地方使用的头文件放在.pch文件,这样就不需要在使用的过程中多次写头文件;等等。
代码下载地址:Alamofire-Kingfisher
(SwiftUI) Kingfisher ForEach 问题
如何解决(SwiftUI) Kingfisher ForEach 问题
我想使用 ForEach 打印网络图像。
*为了打印网络图像,我使用了 3rd 方库 kingfisher。
import SwiftUI
import Kingfisher
struct KingFisherTest: View {
var body: some View {
vstack {
ForEach(0 ..< 3,id: \\.self) { _ in
KFImage(URL(string: "https://cdn.imweb.me/upload/S2017101359e025984d346/bff36a6d2ced4.jpg"))
.resizable()
.frame(width: 150,height: 150)
.onAppear {
print("onAppear!")
}
.ondisappear {
print("ondisappear!")
}
}
}
}
}
struct KingFisherTest_Previews: PreviewProvider {
static var previews: some View {
KingFishertest()
}
}
然而,有一个问题,当打印一张图像时,onAppear() 出现两次。
我希望 onAppear() 执行特定功能,但该问题导致该功能工作两次。
我该如何解决这个问题?
Github每日精选(第28期):Swift图像下载库 Kingfisher
Kingfisher
Kingfisher
是一个功能强大的纯 Swift
库,用于从Web
下载和缓存图像。它使您有机会在下一个应用程序中使用纯 Swift
方式处理远程图像。
特征
- 异步图像下载和缓存。
- 从URLSession基于网络或本地提供的数据加载图像。
- 提供有用的图像处理器和过滤器。
- 内存和磁盘的多层混合缓存。
- 对缓存行为的精细控制。可定制的到期日期和大小限制。
- 可取消下载和自动重用以前下载的内容以提高性能。
- 独立组件。根据需要分别使用下载器、缓存系统和图像处理器。
- 预取图像并从缓存中显示它们以提升您的应用程序。
-
UIImageView
,NSImageView
,NSButton
,UIButton
,NSTextAttachment
,和的扩展名-WKInterfaceImage
,用于直接从 URL 设置图像。TVMonogramViewCPListItem
- 设置图像时内置过渡动画。
- 加载图像时可自定义的占位符和指示器。
- 易于扩展的图像处理和图像格式。
- 低数据模式支持。
-
SwiftUI
支持。
使用方法
最简单的用例是将图像设置为带有UIImageView
扩展名的图像视图:
import Kingfisher
let url = URL(string: "https://example.com/image.png")
imageView.kf.setimage(with: url)
Kingfisher
将从 下载图像url
,将其发送到内存缓存和磁盘缓存,并以imageView
. 当您稍后使用相同的 URL
设置它时,图像将从缓存中检索并立即显示。
如果您使用 SwiftUI,它也可以工作:
var body: some View {
KFImage(URL(string: "https://example.com/image.png")!)
}
高级的例子
借助强大的选项,您可以用 Kingfisher 以简单的方式完成艰巨的任务。例如,下面的代码:
-
下载高分辨率图像。
-
对其进行下采样以匹配图像视图大小。
-
使其以给定的半径转角。
-
下载时显示系统指示器和占位符图像。
-
准备好后,它会以“淡入”效果对小缩略图图像进行动画处理。
-
原始的大图像也被缓存到磁盘以供以后使用,以避免在详细视图中再次下载它。
-
任务完成时会打印控制台日志,无论是成功还是失败。
let url = URL(string: “https://example.com/high_resolution_image.png”)
let processor = DownsamplingImageProcessor(size: imageView.bounds.size)
|> RoundCornerImageProcessor(cornerRadius: 20)
imageView.kf.indicatorType = .activity
imageView.kf.setimage(
with: url,
placeholder: UIImage(named: “placeholderImage”),
options: [
.processor(processor),
.scaleFactor(UIScreen.main.scale),
.transition(.fade(1)),
.cacheOriginalImage
])
{
result in
switch result {
case .success(let value):
print(“Task done for: (value.source.url?.absoluteString ?? “”)”)
case .failure(let error):
print(“Job Failed: (error.localizedDescription)”)
}
}
这是我在日常工作中经常遇到的情况。想想没有Kingfisher
你需要写多少行!
方法链
如果您不是kf扩展的粉丝,您也可以更喜欢使用KF构建器并链接方法调用。下面的代码做同样的事情:
// Use `kf` extension
imageView.kf.setimage(
with: url,
placeholder: placeholderImage,
options: [
.processor(processor),
.loaddiskFileSynchronously,
.cacheOriginalImage,
.transition(.fade(0.25)),
.lowDataMode(.network(lowResolutionURL))
],
progressBlock: { receivedSize, totalSize in
// Progress updated
},
completionHandler: { result in
// Done
}
)
// Use `KF` builder
KF.url(url)
.placeholder(placeholderImage)
.setProcessor(processor)
.loaddiskFileSynchronously()
.cacheMemoryOnly()
.fade(duration: 0.25)
.lowDataModeSource(.network(lowResolutionURL))
.onProgress { receivedSize, totalSize in }
.onSuccess { result in }
.onFailure { error in }
.set(to: imageView)
更好的是,如果以后你想切换到 SwiftUI,只需将KF上面的内容更改为KFImage,你就完成了:
struct ContentView: View {
var body: some View {
KFImage.url(url)
.placeholder(placeholderImage)
.setProcessor(processor)
.loaddiskFileSynchronously()
.cacheMemoryOnly()
.fade(duration: 0.25)
.lowDataModeSource(.network(lowResolutionURL))
.onProgress { receivedSize, totalSize in }
.onSuccess { result in }
.onFailure { error in }
}
}
iOS MJRefresh 下拉刷新 上拉加载(可添加 gif 图版) 小结
先看下需要用到的属性
@property (nonatomic,strong) NSArray *datasArray;@property (nonatomic,strong) UITableView *tableView;@property (nonatomic,strong) NSMutableArray *refreshImages;//刷新动画的图片数组@property (nonatomic,strong) NSMutableArray *normalImages;//普通状态下的图片数组@property (nonatomic,strong) NSTimer *timer;//模拟数据刷新需要的时间控制器@property (nonatomic,assign) int time;
创建一个 TableView, 并实现代理
self.tableView = [[UITableView alloc]init];
[self.view addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.view.mas_top).with.offset(30); make.left.and.right.equalTo(self.view); make.bottom.equalTo(self.view);
}];self.tableView.delegate = self;self.tableView.dataSource = self;
然后开始创建下拉刷新的 header
MJRefreshGifHeader *header =[MJRefreshGifHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
[header setImages:self.refreshImages forState:MJRefreshStateRefreshing];
[header setImages:self.normalImages forState:MJRefreshStateIdle];
[header setImages:self.refreshImages forState:MJRefreshStatePulling];
header.lastUpdatedTimeLabel.hidden= YES;//如果不隐藏这个会默认 图片在最左边不是在中间
header.stateLabel.hidden = YES; self.tableView.mj_header = header;
因为 gif 图片需要一帧一帧图片添加 所以 self.refreshImages 是个存储图片的数组,还有 normalImages 用 懒加载 (点击查看什么是懒加载)
/**
* @author (๑• . •๑) xiaoqiB, 15-11-24 15:11:06
* 普通状态下的图片
*/- (NSMutableArray *)normalImages
{ if (_normalImages == nil) { _normalImages = [[NSMutableArray alloc] init]; UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"dropDown_1"]]; [self.normalImages addObject:image]; } return _normalImages;
}//正在刷新状态下的图片- (NSMutableArray *)refreshImages
{ if (_refreshImages == nil) { _refreshImages = [[NSMutableArray alloc] init]; // 循环添加图片 for (NSUInteger i = 1; i<=8; i++) { UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"dropDown_%ld", i]]; [self.refreshImages addObject:image]; } } return _refreshImages;
}
下面是刷新时 需要调用的方法,本应是获取网路数据的方法,并在获取到网络数据时或者获取失败时,停止刷新
-(void)loadNewData { //模拟刷新的时间 self.timer =[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeAction) userInfo:nil repeats:YES]; self.time = 3;
}
-(void)timeAction { self.time --; NSLog(@"%d",self.time); if (self.time == 0) { // 刷新数据 [_tableView reloadData]; // 停止刷新 [_tableView.mj_header endRefreshing]; [self.timer invalidate]; }
}
iOS MJRefresh 的使用方式
1、导入 MJRefresh 到项目中
- cocoapods 导入:pod ''MJRefresh''
- 将 MJRefresh 文件夹中的所有内容拖拽进项目中。
两种方式任选其一。使用时别忘记引入头文件:#import "MJRefresh.h"
2、UITableView 下拉刷新和上拉刷新
2.1 默认下拉界面
// 设置回调(一旦进入刷新状态就会调用这个refreshingBlock)
self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
//进行数据刷新操作
}];
// 马上进入刷新状态
[self.tableView.mj_header beginRefreshing];
2.2 下拉刷新设置动画图片
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
self.tableView.mj_header = [MJChiBaoZiHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
// 马上进入刷新状态
[self.tableView.mj_header beginRefreshing];
ps:MJChiBaoZiHeader 是继承自 MJRefreshGifHeader,在这里面可以自定义加载动画图片
#import "MJChiBaoZiHeader.h"
@implementation MJChiBaoZiHeader
#pragma mark - 重写方法
#pragma mark 基本设置
- (void)prepare
{
[super prepare];
// 设置普通状态的动画图片
NSMutableArray *idleImages = [NSMutableArray array];
for (NSUInteger i = 1; i<=60; i++) {
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"dropdown_anim__000%zd", i]];
[idleImages addObject:image];
}
[self setImages:idleImages forState:MJRefreshStateIdle];
// 设置即将刷新状态的动画图片(一松开就会刷新的状态)
NSMutableArray *refreshingImages = [NSMutableArray array];
for (NSUInteger i = 1; i<=3; i++) {
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"dropdown_loading_0%zd", i]];
[refreshingImages addObject:image];
}
[self setImages:refreshingImages forState:MJRefreshStatePulling];
// 设置正在刷新状态的动画图片
[self setImages:refreshingImages forState:MJRefreshStateRefreshing];
}
@end
2.3 默认下拉刷新 + 隐藏时间
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
// 设置自动切换透明度(在导航栏下面自动隐藏)
header.automaticallyChangeAlpha = YES;
// 隐藏时间
header.lastUpdatedTimeLabel.hidden = YES;
// 马上进入刷新状态
[header beginRefreshing];
// 设置header
self.tableView.mj_header = header;
2.4 默认下拉刷新 + 隐藏时间、隐藏状态
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
MJChiBaoZiHeader *header = [MJChiBaoZiHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
// 隐藏时间
header.lastUpdatedTimeLabel.hidden = YES;
// 隐藏状态
header.stateLabel.hidden = YES;
// 马上进入刷新状态
[header beginRefreshing];
// 设置header
self.tableView.mj_header = header;
2.5 默认下拉刷新 + 自定义文字
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
// 设置文字
[header setTitle:@"Pull down to refresh" forState:MJRefreshStateIdle];
[header setTitle:@"Release to refresh" forState:MJRefreshStatePulling];
[header setTitle:@"Loading ..." forState:MJRefreshStateRefreshing];
// 设置字体
header.stateLabel.font = [UIFont systemFontOfSize:15];
header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:14];
// 设置颜色
header.stateLabel.textColor = [UIColor redColor];
header.lastUpdatedTimeLabel.textColor = [UIColor blueColor];
// 马上进入刷新状态
[header beginRefreshing];
// 设置刷新控件
self.tableView.mj_header = header;
2.6 下拉刷新 + 自定义 header
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
self.tableView.mj_header = [MJDIYHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
[self.tableView.mj_header beginRefreshing];
ps: MJDIYHeader 是继承自 MJRefreshHeader,在这里面进行自定义 header 视图的操作
#import "MJDIYHeader.h"
@interface MJDIYHeader()
//在这里声明子控件的全局变量
@end
@implementation MJDIYHeader
#pragma mark - 重写方法
#pragma mark 在这里做一些初始化配置(比如添加子控件)
- (void)prepare
{
[super prepare];
// 设置控件的高度
self.mj_h = 50;
// 在这里添加子控件
}
#pragma mark 在这里设置子控件的位置和尺寸
- (void)placeSubviews
{
[super placeSubviews];
//在这里设置子控件的位置和尺寸
}
#pragma mark 监听scrollView的contentOffset改变
- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change
{
[super scrollViewContentOffsetDidChange:change];
}
#pragma mark 监听scrollView的contentSize改变
- (void)scrollViewContentSizeDidChange:(NSDictionary *)change
{
[super scrollViewContentSizeDidChange:change];
}
#pragma mark 监听scrollView的拖拽状态改变
- (void)scrollViewPanStateDidChange:(NSDictionary *)change
{
[super scrollViewPanStateDidChange:change];
}
#pragma mark 监听控件的刷新状态
- (void)setState:(MJRefreshState)state
{
MJRefreshCheckState;
switch (state) {
case MJRefreshStateIdle:
/** 普通闲置状态 */
//在这里设置子控件在普通闲置状态的界面展示
break;
case MJRefreshStatePulling:
/** 松开就可以进行刷新的状态 */
//在这里设置子控件在松开就可以进行刷新的状态的界面展示
break;
case MJRefreshStateRefreshing:
/** 正在刷新中的状态 */
//在这里设置子控件在正在刷新中的状态的界面展示
break;
default:
break;
}
}
#pragma mark 监听拖拽比例(控件被拖出来的比例)
- (void)setPullingPercent:(CGFloat)pullingPercent
{
[super setPullingPercent:pullingPercent];
}
@end
2.7 上拉刷新 默认界面
// 设置回调(一旦进入刷新状态就会调用这个refreshingBlock)
self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
[weakSelf loadMoreData];
}];
2.8 上拉刷新 + 设置动画
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
self.tableView.mj_footer = [MJChiBaoZiFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
#import "MJChiBaoZiFooter.h"
@implementation MJChiBaoZiFooter
#pragma mark - 重写方法
#pragma mark 基本设置
- (void)prepare
{
[super prepare];
// 设置正在刷新状态的动画图片
NSMutableArray *refreshingImages = [NSMutableArray array];
for (NSUInteger i = 1; i<=3; i++) {
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"dropdown_loading_0%zd", i]];
[refreshingImages addObject:image];
}
[self setImages:refreshingImages forState:MJRefreshStateRefreshing];
}
@end
2.9 上拉刷新 隐藏刷新状态的文字
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
MJChiBaoZiFooter *footer = [MJChiBaoZiFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
// 当上拉刷新控件出现50%时(出现一半),就会自动刷新。这个值默认是1.0(也就是上拉刷新100%出现时,才会自动刷新)
// footer.triggerAutomaticallyRefreshPercent = 0.5;
// 隐藏刷新状态的文字
footer.refreshingTitleHidden = YES;
// 设置footer
self.tableView.mj_footer = footer;
2.10 上拉刷新 禁止自动加载
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
MJRefreshAutoNormalFooter *footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
// 禁止自动加载
footer.automaticallyRefresh = NO;
// 设置footer
self.tableView.mj_footer = footer;
2.11 上拉刷新 自定义文字
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
MJRefreshAutoNormalFooter *footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
// 设置文字
[footer setTitle:@"Click or drag up to refresh" forState:MJRefreshStateIdle];
[footer setTitle:@"Loading more ..." forState:MJRefreshStateRefreshing];
[footer setTitle:@"No more data" forState:MJRefreshStateNoMoreData];
// 设置字体
footer.stateLabel.font = [UIFont systemFontOfSize:17];
// 设置颜色
footer.stateLabel.textColor = [UIColor blueColor];
// 设置footer
self.tableView.mj_footer = footer;
3、UIWebView 的下拉刷新和上拉刷新
#pragma mark - 示例
- (void)example31
{
__weak UIWebView *webView = self.webView;
webView.delegate = self;
__weak UIScrollView *scrollView = self.webView.scrollView;
// 添加下拉刷新控件
scrollView.mj_header= [MJRefreshNormalHeader headerWithRefreshingBlock:^{
[webView reload];
}];
// 如果是上拉刷新,就以此类推
}
#pragma mark - webViewDelegate
- (void)webViewDidFinishLoad:(nonnull UIWebView *)webView
{
[self.webView.scrollView.mj_header endRefreshing];
}
4、UICollectionView 的下拉刷新和上拉刷新
#pragma mark - 示例
#pragma mark UICollectionView 上下拉刷新
- (void)example21
{
__weak __typeof(self) weakSelf = self;
// 下拉刷新
self.collectionView.mj_header= [MJRefreshNormalHeader headerWithRefreshingBlock:^{
// 增加5条假数据
for (int i = 0; i<10; i++) {
[weakSelf.colors insertObject:MJRandomColor atIndex:0];
}
// 模拟延迟加载数据,因此2秒后才调用(真实开发中,可以移除这段gcd代码)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(MJDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[weakSelf.collectionView reloadData];
// 结束刷新
[weakSelf.collectionView.mj_header endRefreshing];
});
}];
[self.collectionView.mj_header beginRefreshing];
// 上拉刷新
self.collectionView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingBlock:^{
// 增加5条假数据
for (int i = 0; i<5; i++) {
[weakSelf.colors addObject:MJRandomColor];
}
// 模拟延迟加载数据,因此2秒后才调用(真实开发中,可以移除这段gcd代码)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(MJDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[weakSelf.collectionView reloadData];
// 结束刷新
[weakSelf.collectionView.mj_footer endRefreshing];
});
}];
// 默认先隐藏footer
self.collectionView.mj_footer.hidden = YES;
}
我们今天的关于Swift 集成Alamofire/Kingfisher/MJRefresh/MBProgressHUD的小项目和swift集群的分享已经告一段落,感谢您的关注,如果您想了解更多关于(SwiftUI) Kingfisher ForEach 问题、Github每日精选(第28期):Swift图像下载库 Kingfisher、iOS MJRefresh 下拉刷新 上拉加载(可添加 gif 图版) 小结、iOS MJRefresh 的使用方式的相关信息,请在本站查询。
本文标签: