MJRefresh-简单使用

MJRefresh-简单使用

#import <MJRefresh.h>@interface HKTopicViewController ()
/** 当前最后一条帖子数据的描述信息,专门用来加载下一页数据 */
@property (nonatomic, copy) NSString *maxtime;
/** 所有的帖子数据 */
@property (nonatomic, strong) NSMutableArray<HKTopic *> *topics;
/** 请求管理者 */
@property (nonatomic, strong) AFHTTPSessionManager *manager;
@end- (AFHTTPSessionManager *)manager
{if (!_manager) {_manager = [AFHTTPSessionManager manager];}return _manager;
}- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = RGB(206, 206, 206);self.tableView.contentInset = UIEdgeInsetsMake(HKNavMaxY + HKTitlesViewH, 0, HKTabBarH, 0);self.tableView.scrollIndicatorInsets = self.tableView.contentInset;self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;// 注册cellUINib *nib = [UINib nibWithNibName:NSStringFromClass([HKTopicCell class]) bundle:nil];[self.tableView registerNib:nib forCellReuseIdentifier:HKTopicCellId];[self setupRefresh];
}
- (void)setupRefresh
{// 广告条UILabel *label = [[UILabel alloc] init];label.backgroundColor = [UIColor blackColor];label.frame = CGRectMake(0, 0, 0, 30);label.textColor = [UIColor whiteColor];label.text = @"广告";label.textAlignment = NSTextAlignmentCenter;self.tableView.tableHeaderView = label;// headerself.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewTopics)];// 自动切换透明度self.tableView.mj_header.automaticallyChangeAlpha = YES;[self.tableView.mj_header beginRefreshing];// footerself.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreTopics)];
}
#pragma mark - 数据处理
/***  发送请求给服务器,下拉刷新数据*/
- (void)loadNewTopics
{// 1.取消之前的请求
    [self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];// 2.拼接参数NSMutableDictionary *parameters = [NSMutableDictionary dictionary];parameters[@"a"] = @"list";parameters[@"c"] = @"data";parameters[@"type"] = @(self.type);// 3.发送请求[self.manager GET:HKCommonURL parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {// 存储maxtimeself.maxtime = responseObject[@"info"][@"maxtime"];// 字典数组 -> 模型数据self.topics = [HKTopic mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];// 刷新表格
        [self.tableView reloadData];// 结束刷新
        [self.tableView.mj_header endRefreshing];} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {if (error.code != NSURLErrorCancelled) { // 并非是取消任务导致的error,其他网络问题导致的error[SVProgressHUD showErrorWithStatus:@"网络繁忙,请稍后再试!"];}// 结束刷新
        [self.tableView.mj_header endRefreshing];}];
}/***  发送请求给服务器,上拉加载更多数据*/
- (void)loadMoreTopics
{// 1.取消之前的请求
    [self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];// 2.拼接参数NSMutableDictionary *parameters = [NSMutableDictionary dictionary];parameters[@"a"] = @"list";parameters[@"c"] = @"data";parameters[@"type"] = @(self.type);parameters[@"maxtime"] = self.maxtime;// 3.发送请求[self.manager GET:HKCommonURL parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {// 存储maxtimeself.maxtime = responseObject[@"info"][@"maxtime"];// 字典数组 -> 模型数据NSArray *moreTopics = [HKTopic mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];// 累加到旧数组的后面
        [self.topics addObjectsFromArray:moreTopics];// 刷新表格
        [self.tableView reloadData];// 结束刷新
        [self.tableView.mj_footer endRefreshing];if (self.topics.count >= 60) {[self.tableView.mj_footer endRefreshingWithNoMoreData];} else {[self.tableView.mj_footer endRefreshing];}} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {if (error.code != NSURLErrorCancelled) { // 并非是取消任务导致的error,其他网络问题导致的error[SVProgressHUD showErrorWithStatus:@"网络繁忙,请稍后再试!"];}// 结束刷新
        [self.tableView.mj_footer endRefreshing];}];
}
#pragma mark - 数据源
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{// 根据数据量显示或者隐藏footerself.tableView.mj_footer.hidden = (self.topics.count == 0);return self.topics.count;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{// 清除内存缓存
    [[SDImageCache sharedImageCache] clearMemory];
}

 刷新控件的状态:

/** 刷新控件的状态 */
typedef NS_ENUM(NSInteger, MJRefreshState) {/** 普通闲置状态 */MJRefreshStateIdle = 1,/** 松开就可以进行刷新的状态 */MJRefreshStatePulling,/** 正在刷新中的状态 */MJRefreshStateRefreshing,/** 即将刷新的状态 */MJRefreshStateWillRefresh,/** 所有数据加载完毕,没有更多的数据了 */MJRefreshStateNoMoreData
};

①(局部自定义)设置状态文字颜色-自动切换透明度

自定义一个类HKRefreshHeader继承于:MJRefreshNormalHeader

#import "HKRefreshHeader.h"@implementation HKRefreshHeader- (instancetype)initWithFrame:(CGRect)frame
{if (self = [super initWithFrame:frame]) {// 设置状态文字颜色self.stateLabel.textColor = [UIColor blueColor];self.stateLabel.font = [UIFont systemFontOfSize:17];[self setTitle:@"赶紧下拉刷新" forState:MJRefreshStateIdle];[self setTitle:@"松开?上刷新" forState:MJRefreshStatePulling];[self setTitle:@"正在拼命刷新..." forState:MJRefreshStateRefreshing];// 隐藏时间self.lastUpdatedTimeLabel.hidden = YES;// 自动切换透明度self.automaticallyChangeAlpha = YES;}return self;
}@end

②(全部自定义)

自定义一个类HKCustomRefreshHeader继承于:MJRefreshHeader

#import "HKCustomRefreshHeader.h"
@interface HKCustomRefreshHeader()
/** 开关 */
@property (nonatomic, weak) UISwitch *s;
/** logo */
@property (nonatomic, weak) UIImageView *logo;
@end@implementation HKCustomRefreshHeader
- (instancetype)initWithFrame:(CGRect)frame
{if (self = [super initWithFrame:frame]) {UISwitch *s = [[UISwitch alloc] init];[self addSubview:s];self.s = s;UIImageView *logo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MainTitle"]];[self addSubview:logo];self.logo = logo;//self.height = 70;//修改高度
    }return self;
}- (void)layoutSubviews
{[super layoutSubviews];self.logo.centerX = self.width * 0.5;self.logo.y =  -  3 * self.logo.height;self.s.centerX = self.width * 0.5;self.s.centerY = self.height * 0.5;
}#pragma mark - 重写Header内部的方法
- (void)setState:(MJRefreshState)state
{[super setState:state];if (state == MJRefreshStateIdle) { // 下拉可以刷新
        [self.s setOn:NO animated:YES];[UIView animateWithDuration:0.25 animations:^{self.s.transform = CGAffineTransformIdentity;}];} else if (state == MJRefreshStatePulling) { // 松开立即刷新
        [self.s setOn:YES animated:YES];[UIView animateWithDuration:0.25 animations:^{self.s.transform = CGAffineTransformMakeRotation(M_PI_2);}];} else if (state == MJRefreshStateRefreshing) { // 正在刷新
        [self.s setOn:YES animated:YES];[UIView animateWithDuration:0.25 animations:^{self.s.transform = CGAffineTransformMakeRotation(M_PI_2);}];}
}
@end

使用:

// header
self.tableView.mj_header = [HKRefreshHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewTopics)];

 补充:

MJRefresh 下拉刷新头部不显示的问题

在uicollectionView 头部有偏移量的时候, 往往给其加下拉刷新的的时候 , 头部的字(mj默认的)往往显示不出来, 此时就需要

MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{}];
header.ignoredScrollViewContentInsetTop = 20;
self.collectionView.mj_header              = header;

 

 

转载于:https://www.cnblogs.com/StevenHuSir/p/MJRefresh_Use.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Strange Words 4

2019独角兽企业重金招聘Python工程师标准>>> abnormality 英[ˌbnɔːmləti] 美[ˌbnɔːrmləti] n.变态&#xff1b;反常&#xff1b;异常&#xff1b;畸形 tenor 英 [tenə(r)]  美 [tenər] n.大意&#xff1b;要旨&#xff1b;常规&#xff1b;男高音&…

新字符设备驱动实验(自动分配设备号、自动创建应用层设备节点、新字符设备注册到内核的结构体)

目录自动分配和释放设备号示例代码新的字符设备注册到内核方法字符设备结构体(前面的设备号也放进来)cdev_init结构体初始化函数cdev_add 添加到linux内核cdev_del内核注销函数自动创建应用层设备节点mdev 机制创建和删除类创建删除设备(生成/dev/xxx设备)参考示例(先删除设备再…

$Django importlib与dir知识,手写配置文件, 配置查找顺序 drf分页器drf版本控制

1 importlib与dir知识 # importlib简介动态导入字符串模块 # 常规导入 from ss.aa import b from ss import a print(b,type(b)) #<module ss.aa.b from F:\\python37\\pythonfiles\\ss\\aa\\b.py> #<class module># importlib动态导入py文件模块 import importli…

P1971 [NOI2011]兔兔与蛋蛋游戏

传送门 思路比较迷……题解在这里 //minamoto #include<bits/stdc.h> #define R register #define fp(i,a,b) for(R int ia,Ib1;i<I;i) #define fd(i,a,b) for(R int ia,Ib-1;i>I;--i) #define go(u) for(int ihead[u],ve[i].v;i;ie[i].nx,ve[i].v) using namespac…

网站后台admin修改故事

网站后台登陆有时出错&#xff0c;可以被******&#xff0c;不得不修改密码&#xff0c;使用phpmyadmin修改后台密码账号&#xff0c;刷新。转载于:https://blog.51cto.com/7330234/1355437

springMVC_07乱码及restful风格

乱码的解决 通过过滤器解决乱码问题:CharacterEncodingFilter 配置web.xml文件 <filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><para…

[转】HTTP请求流程(二)----Telnet模拟HTTP请求

转自&#xff1a; http://www.cnblogs.com/stg609/archive/2008/07/06/1237000.html 上一部分"流程简介"&#xff0c; 我们大致了解了下HTTP请求的流程&#xff0c;这一篇我向大家介绍下如何利用Telnet来模拟Http请求---访问百度。 我们直接开始吧&#xff01; …

设备树下的LED驱动实验

目录设备树LED驱动原理硬件原理图分析实验程序编写修改设备树文件(根节点下添加好区分)LED灯驱动程序编写编写测试APP运行测试编译驱动程序和测试APP运行测试上一章我们详细的讲解了设备树语法以及在驱动开发中常用的OF 函数&#xff0c;本章我们就开始第一个基于设备树的Linux…

记录一下Junit测试MongoDB,获取MongoTemplate

只是自己记录一下&#xff0c;测试MongoDB帮助类时&#xff0c;没有配置文件的测试 public class HelperTest {MongoTemplate template;Beforepublic void init() {MongoDbFactory facotry new SimpleMongoDbFactory(new MongoClient("127.1.1.1", 27017), "te…

《现代操作系统》精读与思考笔记 第七章 多媒体

第七章部分内容与前几章内容关联很大&#xff0c;比如进程调度、磁盘调度、文件系统&#xff0c;而且多为实现细节&#xff0c;这里不详述。 1.帧数与闪烁&#xff08;P476&#xff09; 画面动作的平滑性不是完全由每秒的帧数决定的&#xff0c;而是由每秒不同画面的数目决定的…

pinctrl和gpio子系统实验(芯片原厂做的,类似STM32的HAL库,我们只需调用API来直接操作GPIO)

目录pinctrl子系统pinctrl子系统简介(半导体厂商写的)I.MX6ULL的pinctrl子系统驱动分析0、通过compatbile属性查找对应驱动文件1、PIN配置信息详解(获取寄存器地址)2、PIN 驱动程序流程讲解(流程图&#xff0c;了解)设备树中添加pinctrl节点模板(半导体厂商瑞芯微、海思厂商写的…

(五)Redis在项目中应用

目录 1. redis实现分布式锁2. 订单或任务缓存3. Redis和DB数据一致性4. 大并发Redis穿透直接访问DB5. 接口限流器参考&#xff1a; Redis在项目中的运用总结1. redis实现分布式锁 参考&#xff1a; Redis分布式锁的正确实现方式分布式锁简单入门以及三种实现方式介绍127.0.0.1:…

成为你自己

2019独角兽企业重金招聘Python工程师标准>>> 一个看过许多国家、民族以及世界许多地方的旅行家&#xff0c;若有人问他&#xff0c;他在各处发现人们具有什么相同的特征&#xff0c;他或许会回答∶他们有懒惰的倾向。有些人会觉得&#xff0c;如 果他说他们全是怯懦…

网络知识梳理--OSI七层网络与TCP/IP五层网络架构及二层/三层网络

作为一个合格的运维人员&#xff0c;一定要熟悉掌握OSI七层网络和TCP/IP五层网络结构知识。 废话不多说&#xff01;下面就逐一展开对这两个网络架构知识的说明&#xff1a;一、OSI七层网络协议OSI是Open System Interconnect的缩写&#xff0c;意为开放式系统互联。 OSI参考模…

动态链接库 仅有.dll文件时候的使用方法

在没有.h和.lib文件时&#xff0c;需要函数指针和WIN32 API函数 LoadLibrary, GetProcAddress 和FreeLibrary 只需要.dll文件即可&#xff08;将.dll文件置入工程目录中&#xff09;。 LoadLibrary 进程调用 LoadLibrary以显式链接到 DLL。 如果函数执行成功&#xff0c;它会将…

跟vczh看实例学编译原理——一:Tinymoe的设计哲学

自从《序》胡扯了快一个月之后&#xff0c;终于迎来了正片。之所以系列文章叫《看实例学编译原理》&#xff0c;是因为整个系列会通过带大家一步一步实现Tinymoe的过程&#xff0c;来介绍编译原理的一些知识点。 但是第一个系列还没到开始处理Tinymoe源代码的时候&#xff0c;首…

Linux蜂鸣器实验(使用上一节子系统思想,摈弃了自己配置寄存器的繁琐操作)

目录子系统思想的蜂鸣器驱动流程硬件原理图分析实验程序编写修改设备树文件蜂鸣器驱动程序编写编写测试APP运行测试编译驱动程序和测试APP运行测试上一章实验中我们借助pinctrl 和gpio 子系统编写了LED 灯驱动&#xff0c;I.MX6U-ALPHA 开发板上还有一个蜂鸣器&#xff0c;从软…

gitbash如何修改可恶的蓝色字体

1、问题 这完全看不清啊&#xff01;&#xff01; 2、环境 git version 2.19.0 3、解决 1&#xff09;编辑/etc/bash.bashrc # Uncomment to use the terminal colours set in DIR_COLORS eval "$(dircolors -b /etc/DIR_COLORS)" 2&#xff09;编辑/etc/DIR…

Oracle分析函数

2019独角兽企业重金招聘Python工程师标准>>> Oracle分析函数——函数列表 SUM &#xff1a;该函数计算组中表达式的累积和 MIN &#xff1a;在一个组中的数据窗口中查找表达式的最小值 MAX &#xff1a;在一个组中的数据窗口中查找表达式的…

Linux并发与竞争介绍(原子操作、自旋锁、信号量、互斥体)

目录并发与竞争并发与竞争简介保护内容是什么原子操作原子操作简介原子整形操作API函数(atomic_t 结构体)原子位操作API 函数自旋锁自旋锁简介自旋锁API函数线程与线程线程与中断(获取锁之前关闭中断)其他类型的锁(读写锁、顺序锁)自旋锁使用注意事项信号量信号量简介信号量API…