iOS tableView rowAnimation callback

最近有這樣一個需求:

table的第一行高亮,第一行用完以后刪掉,第二行成為第一行萝喘,并高亮惑折。

大致效果是這樣的:


demo

中間這部分是隨便扯一扯的,想看實現(xiàn)恬吕,直接跳到 實現(xiàn)方案

收到這個需求,覺得很簡單:

  1. 刪除第一行
  2. 將第二行滾到頂
  3. 刷新新的第一行

前兩步,很簡單遣臼,一行代碼搞定:

[table deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] 
            withRowAnimation:UITableViewRowAnimationTop];

cell被delete之后,新的cell上來并不會刷新拾并,所以需要手動更新下揍堰。
但是這個刷新時機(jī)遇到點小坑:

直接寫

直接執(zhí)行刪除和reload這兩行代碼蚌讼,delete的動畫效果是需要時間的,但是后邊reload又是立即執(zhí)行的个榕,總體出來的效果不理想篡石,放棄。

after -> scrollViewDelegate

既然直接寫不能實現(xiàn)效果西采,就想需要在動畫結(jié)束之后凰萨,再執(zhí)行后續(xù)操作。首先想到的就是scrollView的delegate械馆。

點進(jìn)去delegate胖眷,有這幾個方法:

  • scrollViewDidEndDecelerating:
    WillBeginDecelerating的注釋中寫著
    "called on finger up as we are moving",也就是手動才會觸發(fā)霹崎。不能用珊搀。

  • scrollViewDidEndScrollingAnimation:
    這個方法的注釋里也寫著"called when setContentOffset/scrollRectVisible:animated: finishes.",而table的rowAnimation也不會觸發(fā)尾菇,不能用.

  • 其他的代理方法也沒有完美匹配的境析。

tricky方法

既然table和scroll的代理里沒有明確給出回調(diào)的方法,那么就用一些替代方法派诬。

  • 比如說劳淆,dispatch_after 0.5s 執(zhí)行結(jié)束后的刷新。
  • 通過scroll滾動到相應(yīng)的位置判斷動畫已經(jīng)結(jié)束默赂。
  • 等等等等
作為一個有追求的工程師沛鸵,肯定是要去尋找真正的解決方案。

解決思路

刪除cell調(diào)用的方法是:

- (void)deleteRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths 
      withRowAnimation:(UITableViewRowAnimation)animation;

顧名思義缆八,這是帶有動畫的曲掰。。奈辰。
順著這個思路栏妖,嘗試去給animation相關(guān)的方法打斷點。

通過斷點發(fā)現(xiàn):在delete的過程中冯挎,執(zhí)行了

[UIView(Animation) commitAnimations]
call stack

知道了rowAnimation底哥,那么給這個animation加個回調(diào)就行了。

首先想到的就是Core Animation的transaction房官≈夯眨看官方文檔:

CATransaction allows you to override default animation properties that are set for animatable properties. You can customize duration, timing function, whether changes to properties trigger animations, and provide a handler that informs you when all animations from the transaction group are completed.

最后一句的意思就是可以回調(diào)了。

而且官方還給了個demo翰守,大意是這個begin()和commit()可以嵌套孵奶,先commit內(nèi)側(cè)動畫,再commit外側(cè)動畫蜡峰。

實現(xiàn)方案

其實具體實現(xiàn)非常簡單:

    [CATransaction begin];
    [CATransaction setCompletionBlock:^{
        [_mainTable reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]]
                    withRowAnimation:UITableViewRowAnimationNone];
    }];
    [_mainTable deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]]
                withRowAnimation:UITableViewRowAnimationTop];
    [CATransaction commit];    

為了方便下次使用了袁,封裝了一個tableview的category

- (void)ym_animatAction:(void(^)(UITableView *table))action
               complete:(void(^)(UITableView *table))callback {
    [CATransaction begin];
    [CATransaction setCompletionBlock:^{
        callback(self);
    }];
    action(self);
    [CATransaction commit];
}

使用時直接調(diào)用即可

    [_mainTable ym_animatAction:^(UITableView *table) {
        <#animat code#>
    } complete:^(UITableView *table) {
        <#complete code#>
    }];

one more thing

這里使用CATransaction來處理這個動畫朗恳,只是一個比較簡潔的做法。

同理载绿,也有很多其他思路:比如說從UIView的setAnimationDidStopSelector:方法入手粥诫。以后有機(jī)會再來研究。

最后崭庸,上面的代碼寫了一個demo怀浆,在 GitHub

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市怕享,隨后出現(xiàn)的幾起案子执赡,更是在濱河造成了極大的恐慌,老刑警劉巖函筋,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沙合,死亡現(xiàn)場離奇詭異,居然都是意外死亡跌帐,警方通過查閱死者的電腦和手機(jī)首懈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來含末,“玉大人猜拾,你說我怎么就攤上這事即舌∮逗校” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵顽聂,是天一觀的道長肥惭。 經(jīng)常有香客問我,道長紊搪,這世上最難降的妖魔是什么蜜葱? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮耀石,結(jié)果婚禮上牵囤,老公的妹妹穿的比我還像新娘。我一直安慰自己滞伟,他們只是感情好揭鳞,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梆奈,像睡著了一般野崇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亩钟,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天乓梨,我揣著相機(jī)與錄音鳖轰,去河邊找鬼。 笑死扶镀,一個胖子當(dāng)著我的面吹牛蕴侣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播臭觉,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼睛蛛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胧谈?” 一聲冷哼從身側(cè)響起忆肾,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菱肖,沒想到半個月后客冈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡稳强,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年场仲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片退疫。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡渠缕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出褒繁,到底是詐尸還是另有隱情亦鳞,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布棒坏,位于F島的核電站燕差,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坝冕。R本人自食惡果不足惜徒探,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喂窟。 院中可真熱鬧测暗,春花似錦、人聲如沸磨澡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钱贯。三九已至挫掏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秩命,已是汗流浹背尉共。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工褒傅, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袄友。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓殿托,卻偏偏與公主長得像,于是被迫代替她去往敵國和親剧蚣。 傳聞我的和親對象是個殘疾皇子支竹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

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

  • 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復(fù)雜鸠按,今天將帶大家一窺ios動畫全貌礼搁。在這里你可以看...
    每天刷兩次牙閱讀 8,485評論 6 30
  • 如果想讓事情變得順利,只有靠自己--夏爾·紀(jì)堯姆 上一章介紹了隱式動畫的概念目尖。隱式動畫是在iOS平臺創(chuàng)建動態(tài)用戶界...
    夜空下最亮的亮點閱讀 1,939評論 0 1
  • 在iOS中隨處都可以看到絢麗的動畫效果馒吴,實現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺iOS動畫全貌瑟曲。在這里你可以看...
    F麥子閱讀 5,110評論 5 13
  • 前言 本文只要描述了iOS中的Core Animation(核心動畫:隱式動畫饮戳、顯示動畫)、貝塞爾曲線洞拨、UIVie...
    GitHubPorter閱讀 3,621評論 7 11
  • 目錄: 主要繪圖框架介紹 CALayer 繪圖 貝塞爾曲線-UIBezierPath CALayer子類 補充:i...
    Ryan___閱讀 1,673評論 1 9