直接在系統(tǒng)的UITabBar使用Lottile 動(dòng)畫庫


前提

視覺和產(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)見諒!!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容