MJRefresh框架使用及說明

来源:http://www.cnblogs.com/bossren/archive/2017/01/14/6285779.html
-Advertisement-
Play Games

一. MJRefresh的類解釋. 1.MJRefreshComponent 所有刷新控制項的基類別.(component: 成分,組件) 2.MJRefreshNormalHeader 預設的下拉刷新控制項 3.MJRefreshAutoNormalFooter 預設的上拉刷新控制項 下拉刷新控制項自適應 ...


一. MJRefresh的類解釋.

1.MJRefreshComponent              所有刷新控制項的基類別.(component: 成分,組件)

2.MJRefreshNormalHeader          預設的下拉刷新控制項

3.MJRefreshAutoNormalFooter    預設的上拉刷新控制項                下拉刷新控制項自適應在頁面內容下麵

4.MJRefreshAutoGifFooter          帶動態圖的上拉載入控制項           下拉刷新控制項自適應在頁面內容下麵

5.MJRefreshBackNormalFooter    預設的上拉刷新控制項                下拉刷新控制項一直在屏幕底部

6.MJREfreshBackGifFooter          預設的上拉動畫刷新控制項           下拉刷新控制項一直在屏幕底部

 

總結: 刷新控制項分為: header和footer控制項.                        頭部和尾部刷新控制項

        刷新控制項分為normal和gif狀態.                               普通狀態和刷新控制項和gif動態圖的刷新控制項

        尾部刷新控制項又分為: auto和back兩個模式                自適應尾部刷新控制項位置和刷新控制項位置在底部.

二.各個類中提供的外部方法.

1.MJRefreshComponent

(1) beginRefreshing   // 開始刷新,進入頁面想要自動刷新的時候調用.

      isRefreshing        // 是否正在刷新

      endRefreshing    // 結束刷新,網路請求結束的時候使用.

(2) MJRefreshState  刷新控制項的狀態

複製代碼
/** 刷新控制項的狀態 */
typedef NS_ENUM(NSInteger, MJRefreshState) {
    /** 普通閑置狀態 */
    MJRefreshStateIdle = 1,
    /** 鬆開就可以進行刷新的狀態 */
    MJRefreshStatePulling,
    /** 正在刷新中的狀態 */
    MJRefreshStateRefreshing,
    /** 即將刷新的狀態 */
    MJRefreshStateWillRefresh,
    /** 所有數據載入完畢,沒有更多的數據了 */
    MJRefreshStateNoMoreData
};
複製代碼

(3) automaticallyChangeAlpha 根據拖拽比例自動切換透明度

2.MJRefreshHeader

(1) 

/** 這個key用來存儲上一次下拉刷新成功的時間 */
@property (copy, nonatomic) NSString *lastUpdatedTimeKey;
/** 上一次下拉刷新成功的時間 */
@property (strong, nonatomic, readonly) NSDate *lastUpdatedTime;

(2)

/** 創建header */
+ (instancetype)headerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock;
/** 創建header */
+ (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action;

3.MJRefreshFooter

(1)

/** 創建footer */
+ (instancetype)footerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock;
/** 創建footer */
+ (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action;

(2) endRefreshingWithNoMoreData  提示沒有更多數據.

     resetNoMoreData 重置沒有更多數據

(3) automaticallyHidden 自動根據有無數據來顯示或者隱藏(有數據就顯示,沒數據就隱藏.預設為NO)

三.具體使用

1. 預設的刷新方式

頭部刷新控制項:  MJRefreshNormalHeader

尾部刷新控制項: MJRefreshAutoNormalFooter

複製代碼
- (UITableView *)tableView
{
    if (!_tableView)
    {
        self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
        
        self.tableView.dataSource = self;
        self.tableView.delegate = self;
        
        // 預設的下拉刷新和上拉載入
        self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
         
            // 這個地方是網路請求的處理
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [self.tableView.mj_header endRefreshing];
            });
        }];
        
        self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
            // 這個地方是網路請求的處理
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [self.tableView.mj_footer endRefreshing];
            });
        }];
    }
    return _tableView;
}
複製代碼

 

2. 顯示動畫

頭部刷新控制項:  MJRefreshGifHeader

尾部刷新控制項: MJRefreshAutoGifFooter / MJRefreshBackGifFooter

複製代碼
- (UITableView *)tableView
{
    if (!_tableView)
    {
        self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
        
        self.tableView.dataSource = self;
        self.tableView.delegate = self;
        
        
        MJRefreshGifHeader * header = [MJRefreshGifHeader headerWithRefreshingBlock:^{
            
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [self.tableView.mj_header endRefreshing];
            });
        }];
        
        NSMutableArray * arrayM = [NSMutableArray arrayWithCapacity:0];
        for (int i = 0; i < 30; i ++) {
            UIImage * image = [UIImage imageNamed:[NSString stringWithFormat:@"xz_flower_%d",i + 1]];
            [arrayM addObject:image];
        }
        
        // 設置普通狀態下的動畫圖片  -->  靜止的一張圖片
        NSArray * normalImagesArray = @[[UIImage imageNamed:@"xz_flower_1"]];
        [header setImages:normalImagesArray forState:MJRefreshStateIdle];
        
        // 設置即將刷新狀態的動畫圖片
        [header setImages:arrayM forState:MJRefreshStatePulling];
        
        // 設置正在刷新狀態的動畫圖片
        [header setImages:arrayM forState:MJRefreshStateRefreshing];
        
        // 設置header
        self.tableView.mj_header = header;
    }
    return _tableView;
}
複製代碼

 

3.設置刷新控制項的時間和狀態的顯示或者隱藏

複製代碼
- (UITableView *)tableView
{
    if (!_tableView)
    {
        self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
        
        self.tableView.dataSource = self;
        self.tableView.delegate = self;
        
        MJRefreshGifHeader * header = [MJRefreshGifHeader headerWithRefreshingBlock:^{
            
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [self.tableView.mj_header endRefreshing];
            });
        }];
        
        NSMutableArray * arrayM = [NSMutableArray arrayWithCapacity:0];
        for (int i = 0; i < 30; i ++) {
            UIImage * image = [UIImage imageNamed:[NSString stringWithFormat:@"xz_flower_%d",i + 1]];
            [arrayM addObject:image];
        }
        
        NSArray * normalImagesArray = @[[UIImage imageNamed:@"xz_flower_1"]];
        [header setImages:normalImagesArray forState:MJRefreshStateIdle];
        
        [header setImages:arrayM forState:MJRefreshStatePulling];
        
        [header setImages:arrayM forState:MJRefreshStateRefreshing];
        
        
        // 隱藏時間
        header.lastUpdatedTimeLabel.hidden = YES;
        // 隱藏狀態
        header.stateLabel.hidden = YES;
        
        // 設置header
        self.tableView.mj_header = header;
    }
    return _tableView;
}
複製代碼

 

4. 自定義刷新控制項的文字大小和顏色

複製代碼
- (UITableView *)tableView
{
    if (!_tableView)
    {
        self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
        
        self.tableView.dataSource = self;
        self.tableView.delegate = self;
        
        MJRefreshNormalHeader * header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
            
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                
                [self.tableView.mj_header endRefreshing];
            });
        }];
        
        // 設置文字
        [header setTitle:@"下拉刷新" forState:MJRefreshStateIdle];
        [header setTitle:@"更新" forState:MJRefreshStatePulling];
        [header setTitle:@"Loading..." forState:MJRefreshStateRefreshing];
        
        // 設置字體
        header.stateLabel.font = [UIFont systemFontOfSize:15];
        header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:12];
        
        // 設置顏色
        header.stateLabel.textColor = [UIColor redColor];
        header.lastUpdatedTimeLabel.textColor = [UIColor redColor];
        
        [header beginRefreshing];
        
        self.tableView.mj_header = header;
    }
    return _tableView;
}
複製代碼

 

5. 當全部載入完畢的時候,改變尾部刷新控制項的顯示(不允許再刷新)

複製代碼
- (UITableView *)tableView
{
    if (!_tableView)
    {
        self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
        
        self.tableView.dataSource = self;
        self.tableView.delegate = self;
        
        MJRefreshAutoNormalFooter * footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
            
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [self.tableView.mj_footer endRefreshing];
                [self.tableView.mj_footer endRefreshingWithNoMoreData];
            });
        }];
        self.tableView.mj_footer = footer;
    }
    return _tableView;
}
複製代碼

 

重設載入完畢

    [self.tableView.mj_footer resetNoMoreData];

 

6.自定義刷新控制項

繼承 MJRefreshHeader / MJRefreshGifHeader / MJRefreshAutoGifFooter / MJRefreshBackGifFooter / MJRefreshAutoFooter /MJRefreshBackFooter

#import "MJRefreshHeader.h"

@interface MCDIYHeader : MJRefreshHeader

@end

 

複製代碼
#import "MCDIYHeader.h"

@interface MCDIYHeader ()

@property (weak, nonatomic) UILabel *label;
@property (weak, nonatomic) UISwitch *s;
@property (weak, nonatomic) UIImageView *logo;
@property (weak, nonatomic) UIActivityIndicatorView *loading;

@end

@implementation MCDIYHeader

#pragma mark - 重寫方法
#pragma mark 在這裡做一些初始化配置(比如添加子控制項)
- (void)prepare {

    [super prepare];
    
    // 設置控制項的高度
    self.mj_h = 50;
    
    // 添加label
    UILabel *label = [[UILabel alloc] init];
    label.textColor = [UIColor colorWithRed:1.0 green:0.5 blue:0.0 alpha:1.0];
    label.font = [UIFont boldSystemFontOfSize:16];
    label.textAlignment = NSTextAlignmentCenter;
    [self addSubview:label];
    self.label = label;
    
    // 打醬油的開關
    UISwitch *s = [[UISwitch alloc] init];
    [self addSubview:s];
    self.s = s;
    
    // logo
    UIImageView *logo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Logo"]];
    logo.contentMode = UIViewContentModeScaleAspectFit;
    [self addSubview:logo];
    self.logo = logo;
    
    // loading
    UIActivityIndicatorView *loading = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    [self addSubview:loading];
    self.loading = loading;
}

#pragma mark 在這裡設置子控制項的位置和尺寸
- (void)placeSubviews
{
    [super placeSubviews];
    
    self.label.frame = self.bounds;
    
    self.logo.bounds = CGRectMake(0, 0, self.bounds.size.width, 100);
    self.logo.center = CGPointMake(self.mj_w * 0.5, - self.logo.mj_h + 20);
    
    self.loading.center = CGPointMake(self.mj_w - 30, self.mj_h * 0.5);
}

#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:
            [self.loading stopAnimating];
            [self.s setOn:NO animated:YES];
            self.label.text = @"趕緊下拉吖(開關是打醬油滴)";
            break;
        case MJRefreshStatePulling:
            [self.loading stopAnimating];
            [self.s setOn:YES animated:YES];
            self.label.text = @"趕緊放開我吧(開關是打醬油滴)";
            break;
        case MJRefreshStateRefreshing:
            [self.s setOn:YES animated:YES];
            self.label.text = @"載入數據中(開關是打醬油滴)";
            [self.loading startAnimating];
            break;
        default:
            break;
    }
}

#pragma mark 監聽拖拽比例(控制項被拖出來的比例)
- (void)setPullingPercent:(CGFloat)pullingPercent
{
    [super setPullingPercent:pullingPercent];
    
    // 1.0 0.5 0.0
    // 0.5 0.0 0.5
    CGFloat red = 1.0 - pullingPercent * 0.5;
    CGFloat green = 0.5 - 0.5 * pullingPercent;
    CGFloat blue = 0.5 * pullingPercent;
    self.label.textColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
}

@end
複製代碼

 

使用: 

- (UITableView *)tableView
{
    if (!_tableView)
    {
        self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
        
        self.tableView.dataSource = self;
        self.tableView.delegate = self;
        
        
        // 使用自定的刷新控制項
        self.tableView.mj_header = [MCDIYHeader headerWithRefreshingBlock:^{
           
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [self.tableView.mj_header endRefreshing];
            });
            [self.tableView.mj_header beginRefreshing];
        }];
    }
    return _tableView;
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 設計師很多時候會有一像素線的需求,怎麼去實現有下麵幾種方法。 一、 Image 1. 資源圖片 找設計師要個圖片,用UIImageView 或者 CALayer的方式顯示出來 2. CoreGraphics繪製 用CoreCraphics的方式畫一個 UIImage,然後用1的方法展示出來 此類方法 ...
  • 此開源框架官網地址:https://github.com/astuetz/PagerSlidingTabStrip 可以理解為配合ViewPager使用的互動式頁面指示器控制項。 話不多說,先上效果圖: 為了演示其中的pstsIndicatorHeight與pstsUnderlineHeight 的區 ...
  • 前兩天群里有兄弟在吐槽,做遠程推送的時候:老闆要求APP桌面圖標的右上角顯示紅色未讀數字(數字角標)要精準,有多少未讀通知就顯示數字幾;但是後臺的弟兄在發送推送通知的時候,每次的角標是1,然後要移動端這邊自己去把這個未讀數字去累加,然後顯示在APP上;並且後臺非常固執的認為這個累加未讀消息數量是在移 ...
  • 開發小程式所需的基本技能 關於小程式的介紹和使用場景這裡不作介紹,這個系列的文章會一步一步地帶領大家快速地學習和掌握小程式的開發。 關於還沒有接觸過小程式的開發者來說,最關心的問題無非就是,開發小程式,我需要掌握哪些技能? 從我學習小程式的經驗中得出,開發小程式的基本要求: 如果你是一名已經工作1年 ...
  • 演示環境:Mac OSX10.12.2 Xcode8 先瞄一眼最終成果~ 1.JDK,DBMS(演示環境使用Mysql) 2.創建sonar資料庫和用戶 3. "下載sonar" 演示環境使用v6.1,下載後解壓到 /usr/local/sonar/ 4. "下載sonar runner" :演示環 ...
  • 目錄操作和文件管理 學習目標 1.理解單例 2.掌握NSFileManager類常用的文件管理操 3.掌握NSFileHandle類常用的文件數據操作 4.瞭解NSData類的常用操作 5.掌握Plist文件讀寫 —————————————————————— 通常程式在運行中或者程式結束之後,需要保 ...
  • 記憶體管理 對於這篇呢,其實現在都是ARC模式,正常狀態下基本不用我們去手動釋放記憶體,所以如果不是要面試呀、裝逼或者扎實功底的,就先別看了或者瞭解下即可,因為像面試時,有些面試官想看你的基礎時,就有些人會問,現在工作基本不會用到。 學習目標 1. 掌握記憶體管理的原理 2. 掌握手動記憶體管理 1.需要理 ...
  • 繼承、多態、類別 學習目標 1、繼承的含義 2、父類子類的別稱 3、欄位和消息的繼承 4、重寫和重寫消息的調用 5、多態 6、類別(Category) 1.需要理解的知識 面向對象的三個基本特征: 1、封裝 2、繼承 3、多態 1、繼承(單繼承): 父類(超類)和子類的關係。 繼承的兩個類,存在父子 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...