前提
視覺和產(chǎn)品現(xiàn)狀決定不能重新定義TabBar,只能在系統(tǒng)的TabBar上用lottie庫做動(dòng)畫。
玩過lottie 的同學(xué)應(yīng)該都知道,lottile 主流做法就是LOTAnimationView 加載bundle里面的.json資源文件。
由于iOS系統(tǒng)的TabBar繼承于UIView,它的子視圖即我們點(diǎn)擊的tabbar按鈕:UITabBarButton(此類只能在debug的時(shí)候看到,系統(tǒng)沒有暴露出來,所以我們沒辦法引用),但是我們?cè)赿ebug過程中發(fā)現(xiàn)它是繼承與UIControl。所以可以用虛函數(shù)方式來引用它:即UIControll *control =?UITabBarButton。這樣的目的是為了在它上面添加我們自定義的LotAnimationView
圖一
初始化CUstomLoATView ,繼承于LOTAnimationView,為什么這樣做下面會(huì)分析。

圖二
遍歷出tabbar 的子視圖UITabBarButton ,然后把CustomLotAVView 加到?UITabBarButton上去。self.imageViewMap 是存儲(chǔ)的初始化好的CustomLotAVView映射。具體結(jié)構(gòu)@{@"1000": @"LotiView1",@"1001":@"lotiView2",@"1002",@"lotview3"}

圖三

然后根據(jù)tag值來取對(duì)應(yīng)的lotiView
圖三就是打印出 UITabBarButton具體屬性參數(shù),系統(tǒng)沒暴露出來,所以無法引用。
其他看注釋即可明白,
這里需要說明一下實(shí)現(xiàn)大致邏輯:
UITabbarItem 里面有一個(gè)tag,可以用來標(biāo)示是那個(gè)這個(gè)item,初始化的時(shí)候我把item的tag 設(shè)置成上面self.imageViewMap的key值即tag。這樣做的目的是為了后面點(diǎn)擊tabbar的時(shí)候通過代理回調(diào)拿到item然后根據(jù)item的tag 取self.imageViewMap里面對(duì)應(yīng)的lotiview。
總結(jié)一下:即建立起UITabbarItem 和lotiView 之間對(duì)應(yīng)關(guān)系。然后在- (void)tabBar:(UITabBar*)tabBardidSelectItem:(UITabBarItem*)item 取對(duì)應(yīng)的lotiView去做動(dòng)畫,如果還沒看明白就看下面圖
在點(diǎn)擊tabbar 的回調(diào)里面拿到item.tag 再取到對(duì)應(yīng)的lotiView,在調(diào)用[view play]即可做動(dòng)畫!,標(biāo)紅的是坑,下面會(huì)具體解釋
圖四:

踩坑一:
開始以為這樣做了之后就基本沒問題了,運(yùn)行程序之后發(fā)現(xiàn)點(diǎn)擊tabbar沒反應(yīng)。經(jīng)過一系列判斷推測等等騷操作 的出結(jié)論LotiView 把事件攔截了導(dǎo)致事件沒有傳遞給其父視圖UITabBarButton,所以自定義一個(gè)CustomLoTAView 然后再里面的hittest強(qiáng)行把事件傳遞給其父視圖。具體請(qǐng)看代碼片段:
圖五

通過super 方法拿到View,其實(shí)就是CustomLoTAView 的實(shí)例。然后利用相應(yīng)鏈 nextReponder來獲取其下層的事件接受著:即 父視圖-> UITbarBarButton。當(dāng)然這代碼寫的不嚴(yán)謹(jǐn),沒對(duì)nextResponder進(jìn)行類型判斷。后面會(huì)加上去,但是對(duì)于目前的業(yè)務(wù)是足夠了
這樣就把點(diǎn)擊事件交給系統(tǒng)去處理。我們不用關(guān)心。
圖六

踩坑二:
現(xiàn)在來填圖四的坑,把圖四拿過來

會(huì)發(fā)現(xiàn)點(diǎn)擊tabbar的時(shí)候通過代理拿到item,然后通過item.tag 拿不到對(duì)應(yīng)的CustomLoAView,真是日了狗了。又廢了一系列腦細(xì)包發(fā)現(xiàn)原因是:初始化的時(shí)候沒有給UIBarItem 的title和image。所以系統(tǒng)自動(dòng)幫我們生產(chǎn)item。所以我們自己的tag 自然就沒有了,具體解決,看截圖:

YSDockItem 是一個(gè)對(duì)象 就是對(duì)UIBarItem 的一些titile,image 和tag 等一些參數(shù),然后賦值:由于公司代碼不方便上傳具體結(jié)構(gòu),請(qǐng)見諒。
其中image 和title其實(shí)都是沒數(shù)據(jù),所以self.tabBarItem 雖然初始化出來但是點(diǎn)擊- (void)tabBar:(UITabBar*)tabBardidSelectItem:(UITabBarItem*)item 時(shí)候這個(gè)item 是系統(tǒng)新生成的不帶初始化的tag,各位看官可以去試試。
所以生成一個(gè)空的image來占位。不讓系統(tǒng)在生成新的UITabBarItem。
由于真機(jī)效果視頻還在審核,先放一下gif的最后的效果:

具體代碼由于特殊規(guī)定不能全部上傳,請(qǐng)見諒!!