GVKun编程网logo

Swift 集成Alamofire/Kingfisher/MJRefresh/MBProgressHUD的小项目(swift集群)

1

关于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集群)

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 问题

如何解决(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

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 以简单的方式完成艰巨的任务。例如,下面的代码:

  1. 下载高分辨率图像。

  2. 对其进行下采样以匹配图像视图大小。

  3. 使其以给定的半径转角。

  4. 下载时显示系统指示器和占位符图像。

  5. 准备好后,它会以“淡入”效果对小缩略图图像进行动画处理。

  6. 原始的大图像也被缓存到磁盘以供以后使用,以避免在详细视图中再次下载它。

  7. 任务完成时会打印控制台日志,无论是成功还是失败。

    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 图版) 小结

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 的使用方式

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 的使用方式的相关信息,请在本站查询。

本文标签: