iOS 使用lottie動(dòng)畫自定義TabBarItem

前言

????對(duì)于自定義tabBar。我們?cè)诤芏鄷r(shí)候需要在點(diǎn)擊tabbar按鈕時(shí)會(huì)有動(dòng)畫效果。在動(dòng)畫界,有一個(gè)非常非常強(qiáng)大的動(dòng)畫框架Lottie。只要你的UI設(shè)計(jì)師給力,理論上可以實(shí)現(xiàn)任意動(dòng)畫,而且只需要幾行代碼。接下來是我研究的使用lottie動(dòng)畫來實(shí)現(xiàn)(也許有更簡便的方式,希望留言告知)。先看一下效果

Nov-26-2019 15-46-59.gif

實(shí)現(xiàn)原理

????簡單一句話,lottie動(dòng)畫的載體控件本質(zhì)上是一個(gè)UIView,我們要做的就將這個(gè)UIView通過addSubView的方式加到tabBarItem上。
????為了使其位置準(zhǔn)確,我們最理想的是將lottie的位置和大小放置的和原生的image的位置大小一致。因此我們需要找到原生的image的載體UIImageView(應(yīng)該可以想象的到,原生的tabBarItem必有一個(gè)UIImageView)。
????接下來是找到這個(gè)原生的UIImageView,看代碼

//這個(gè)是自定義UITabBar的layoutSubviews方法
- (void)layoutSubviews {
    [super layoutSubviews];
    
    //添加lottie的操作,只可以做一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //三個(gè)lottieView
        DLLottieView *view = [DLLottieView animationWithSelectName:@"arrow_select" unselectName:@"arrow_unselect"];
        DLLottieView *view1 = [DLLottieView animationWithSelectName:@"second_select" unselectName:@"second_unselect"];
        DLLottieView *view2 = [DLLottieView animationWithSelectName:@"arrow_select" unselectName:@"arrow_unselect"];

        self.itemArr = @[view,view1,view2];

        NSInteger flag = 0;
        //遍歷UITabbar的子控件
        for (UIView *barBtn in self.subviews) {
            //其中有一個(gè)子控件是UITabBarButton類型。
            if ([barBtn isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
                UIImageView *tabBarSwappableImageView = [[UIImageView alloc] init];;
                
                //在UITabBarButton的子控件中有一個(gè)UITabBarSwappableImageView類型,這就是tabBarItem用來展示圖片的imageView
                for (UIView *subView in barBtn.subviews) {
                    if ([subView isKindOfClass:NSClassFromString(@"UITabBarSwappableImageView")]) {
                        tabBarSwappableImageView = (UIImageView *)subView;
                    }
                }
                
                //拿到這個(gè)imageView,給它添加lottie
                [tabBarSwappableImageView addSubview:self->_itemArr[flag]];
                
                //設(shè)置lottie的位置大小
                CGFloat width = self->_needSetBiggerItem && flag == self->_biggerItemIndex ? 52 : 32;
                CGFloat y = self->_needSetBiggerItem && flag == self->_biggerItemIndex ? 10 : 0;

                self->_itemArr[flag].frame = CGRectMake(0, 0, width, width);
                self->_itemArr[flag].center = CGPointMake(tabBarSwappableImageView.center.x, tabBarSwappableImageView.center.y - y);
                flag ++;

            }
        }
        [self playAnimationForIndex:0];
    });
}

????代碼中的注釋說的比較詳細(xì)。總而言之就是找到原生的Imageview,給它加上LottieView,再設(shè)置上合適的大小位置。
????上面這段是核心代碼,當(dāng)然還有一些處理點(diǎn)擊動(dòng)畫的簡單方法,具體可以看demo

其他

????里面還可以順便實(shí)現(xiàn)中間按鈕凸出這類需求。

?著作權(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)容

  • 好的APP用戶界面動(dòng)畫如果通過精準(zhǔn)的設(shè)計(jì)就能極大地提升用戶體驗(yàn)。這也常常是區(qū)分APP優(yōu)秀與否的一個(gè)重要標(biāo)準(zhǔn)。實(shí)現(xiàn)與...
    coder_小玖閱讀 6,024評(píng)論 9 45
  • "據(jù)中國山東網(wǎng)濟(jì)寧1月31日訊,春節(jié)過后,濟(jì)寧市城市管理執(zhí)法支隊(duì)六大隊(duì)對(duì)轄區(qū)道路車站東路、南文昌閣街開展了春聯(lián)“福...
    居仁堂主閱讀 410評(píng)論 0 0
  • 酒過三旬沐秋風(fēng), 庭中滿是狗怒聲。 本是團(tuán)圓月不見, 卸下斯文悲中生。 徐蘇云201...
    喵了個(gè)咪___閱讀 248評(píng)論 0 2
  • 潘潘潘咯咯咯閱讀 119評(píng)論 0 0
  • 咖啡冥想 2018.7.2 先生約我去外面共進(jìn)晚餐,陪我逛街,挑選漂亮的衣服。 打電話給公婆是否愿意到我們這里過夏...
    黃小嵐_cd20閱讀 109評(píng)論 0 0

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