MJRefresh研究三MJRefreshBackFooter

MJRefreshBackFooter


重寫MJRefreshComponent處理監(jiān)聽的方法
根據(jù)滾動的offset算出scrollView的滾動距離

#pragma mark - 初始化
- (void)willMoveToSuperview:(UIView *)newSuperview
{
    [super willMoveToSuperview:newSuperview];
    
    [self scrollViewContentSizeDidChange:nil];
}

#pragma mark - 實(shí)現(xiàn)父類的方法
- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change
{
    [super scrollViewContentOffsetDidChange:change];
    
    // 如果正在刷新趣席,直接返回
    if (self.state == MJRefreshStateRefreshing) return;
    
    _scrollViewOriginalInset = self.scrollView.contentInset;
    
    // 當(dāng)前的contentOffset
    CGFloat currentOffsetY = self.scrollView.mj_offsetY;
    // 尾部控件剛好出現(xiàn)的offsetY
    CGFloat happenOffsetY = [self happenOffsetY];
    // 如果是向下滾動到看不見尾部控件,直接返回
    if (currentOffsetY <= happenOffsetY) return;
    
    CGFloat pullingPercent = (currentOffsetY - happenOffsetY) / self.mj_h;
    
    // 如果已全部加載,僅設(shè)置pullingPercent帆调,然后返回
    if (self.state == MJRefreshStateNoMoreData) {
        self.pullingPercent = pullingPercent;
        return;
    }
    
    if (self.scrollView.isDragging) {
        self.pullingPercent = pullingPercent;
        // 普通 和 即將刷新 的臨界點(diǎn)
        CGFloat normal2pullingOffsetY = happenOffsetY + self.mj_h;
        
        if (self.state == MJRefreshStateIdle && currentOffsetY > normal2pullingOffsetY) {
            // 轉(zhuǎn)為即將刷新狀態(tài)
            self.state = MJRefreshStatePulling;
        } else if (self.state == MJRefreshStatePulling && currentOffsetY <= normal2pullingOffsetY) {
            // 轉(zhuǎn)為普通狀態(tài)
            self.state = MJRefreshStateIdle;
        }
    } else if (self.state == MJRefreshStatePulling) {// 即將刷新 && 手松開
        // 開始刷新
        [self beginRefreshing];
    } else if (pullingPercent < 1) {
        self.pullingPercent = pullingPercent;
    }
}

處理設(shè)置footer的frame的y犯助,如果顯示內(nèi)容超過顯示區(qū)域的高度則y在顯示內(nèi)容下面,如果顯示內(nèi)容不足以顯示占滿顯示區(qū)域,footer的y在顯示區(qū)域的下面

- (void)scrollViewContentSizeDidChange:(NSDictionary *)change
{
    [super scrollViewContentSizeDidChange:change];
    
    // 顯示內(nèi)容的高度
    CGFloat contentHeight = self.scrollView.mj_contentH + self.ignoredScrollViewContentInsetBottom;
    // 表格的高度牲证,可顯示區(qū)域的高度
    CGFloat scrollHeight = self.scrollView.mj_h - self.scrollViewOriginalInset.top - self.scrollViewOriginalInset.bottom + self.ignoredScrollViewContentInsetBottom;
    // 設(shè)置位置和尺寸
// 如果顯示內(nèi)容超過顯示區(qū)域的高度則y在顯示內(nèi)容下面研叫,如果顯示內(nèi)容不足以顯示占滿顯示區(qū)域锤窑,footer的y在顯示區(qū)域的下面
    self.mj_y = MAX(contentHeight, scrollHeight);
}

根據(jù)設(shè)置的狀體進(jìn)行相應(yīng)的操作

- (void)setState:(MJRefreshState)state
{
    MJRefreshCheckState
    
    // 根據(jù)狀態(tài)來設(shè)置屬性
    if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) {
        // 刷新完畢
        if (MJRefreshStateRefreshing == oldState) {
            [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{
                self.scrollView.mj_insetB -= self.lastBottomDelta;
                
                // 自動調(diào)整透明度
                if (self.isAutomaticallyChangeAlpha) self.alpha = 0.0;
            } completion:^(BOOL finished) {
                self.pullingPercent = 0.0;
                
                if (self.endRefreshingCompletionBlock) {
                    self.endRefreshingCompletionBlock();
                }
            }];
        }
        
        CGFloat deltaH = [self heightForContentBreakView];
        // 剛刷新完畢
        if (MJRefreshStateRefreshing == oldState && deltaH > 0 && self.scrollView.mj_totalDataCount != self.lastRefreshCount) {
            self.scrollView.mj_offsetY = self.scrollView.mj_offsetY;
        }
    } else if (state == MJRefreshStateRefreshing) {
        // 記錄刷新前的數(shù)量
        self.lastRefreshCount = self.scrollView.mj_totalDataCount;
        
        [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{
            CGFloat bottom = self.mj_h + self.scrollViewOriginalInset.bottom;
            CGFloat deltaH = [self heightForContentBreakView];
            if (deltaH < 0) { // 如果內(nèi)容高度小于view的高度
                bottom -= deltaH;
            }
            self.lastBottomDelta = bottom - self.scrollView.mj_insetB;
            self.scrollView.mj_insetB = bottom;
            self.scrollView.mj_offsetY = [self happenOffsetY] + self.mj_h;
        } completion:^(BOOL finished) {
            [self executeRefreshingCallback];
        }];
    }
}

總結(jié):
1、對offset進(jìn)行判斷嚷炉,并且判斷isDragging
2渊啰、隨著contentSize變化調(diào)整footer的y
3、修改scrollView.contentInset
狀態(tài)間的變化申屹,對scrollView的inset進(jìn)行修改绘证,是的能看見footer或恢復(fù)成原狀,這個(gè)很特別

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哗讥,一起剝皮案震驚了整個(gè)濱河市嚷那,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杆煞,老刑警劉巖魏宽,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異决乎,居然都是意外死亡队询,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門构诚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚌斩,“玉大人,你說我怎么就攤上這事范嘱∷蜕牛” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵彤侍,是天一觀的道長肠缨。 經(jīng)常有香客問我,道長盏阶,這世上最難降的妖魔是什么晒奕? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上脑慧,老公的妹妹穿的比我還像新娘魄眉。我一直安慰自己,他們只是感情好闷袒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布坑律。 她就那樣靜靜地躺著,像睡著了一般囊骤。 火紅的嫁衣襯著肌膚如雪晃择。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天也物,我揣著相機(jī)與錄音宫屠,去河邊找鬼。 笑死滑蚯,一個(gè)胖子當(dāng)著我的面吹牛浪蹂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播告材,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼坤次,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了斥赋?” 一聲冷哼從身側(cè)響起缰猴,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洛波,沒想到半個(gè)月后骚露,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焰扳,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹋嵌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年恋脚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糟描。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡工猜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出犹褒,到底是詐尸還是另有隱情,我是刑警寧澤宙枷,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布诅病,位于F島的核電站贤笆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏板辽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一巧鸭、第九天 我趴在偏房一處隱蔽的房頂上張望瓶您。 院中可真熱鬧,春花似錦纲仍、人聲如沸呀袱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夜赵。三九已至,卻和暖如春乡革,著一層夾襖步出監(jiān)牢的瞬間寇僧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工沸版, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嘁傀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓视粮,卻偏偏與公主長得像细办,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蕾殴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容