TabBarItem添加動畫的一種思路

父老鄉(xiāng)親們,我葫蘆娃又回來了~
今天我們來侃一侃tabBarItem中動畫的另一種實現(xiàn)方式;

前幾日學習項目,需要給tabBarItem添加一個類似彈簧效果的動畫,原作者的思路是自定義了幾個View填充了tabBar,給這些View設置了手勢監(jiān)聽來實現(xiàn)動畫效果,代碼非常繁瑣,如果只是簡單的讓tabBarItem實現(xiàn)需求的動畫,我嘗試著有沒有更簡單的方法來做;原項目的效果如下:

原版動畫.gif

動畫的實現(xiàn),本質來講就是拿到需要實現(xiàn)動畫的UIView,然后把需求動畫添加到它的layer上就可以了;
我們現(xiàn)在的目的就是拿到TabBar上對應的控件,把對應的動畫添加上去;這樣就可以既使用系統(tǒng)的tabBar原有的功能,又添加了動畫;
假定我現(xiàn)在的需求是只給tabBarItem中的image添加一個彈簧效果;

  • 自定義tabBar
  • 在自定義的tabBar中拿到點擊控件,添加點擊的監(jiān)聽事件
  • 在監(jiān)聽事件中把動畫添加到動畫控件的layer上

(1) 由于tabBartabBarController的只讀屬性,因此我們用KVC來設置

- (void)viewDidLoad {   
    [super viewDidLoad];
     //使用KVC來進行設置
    FGTabBar *myTabBar = [[FGTabBaralloc] init];
    [selfsetValue:myTabBar forKey:@"tabBar"]; 
}

(2) 在自定義的tabBar中,嘗試從tabBar的子控件中下手;

- (void)layoutSubviews
{
    [super layoutSubviews];
    NSLog(@"%@",self.subviews);
}

打印結果如下:

 "<_UITabBarBackgroundView: 0x7fddb21236e0; frame = (0 0; 375 49); autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x7fddb21297d0>>",   
 "<UITabBarButton: 0x7fddb23bb500; frame = (2 1; 90 48); opaque = NO; layer = <CALayer: 0x7fddb2130880>>",   
 "<UITabBarButton: 0x7fddb217e1a0; frame = (96 1; 90 48); opaque = NO; layer = <CALayer: 0x7fddb217eec0>>",  
 "<UITabBarButton: 0x7fddb2184700; frame = (190 1; 89 48); opaque = NO; layer = <CALayer: 0x7fddb2184e20>>",  
 "<UITabBarButton: 0x7fddb21893c0; frame = (283 1; 90 48); opaque = NO; layer = <CALayer: 0x7fddb2189b60>>",
 "<UIImageView: 0x7fddb217ea70; frame = (0 -0.5; 375 0.5); autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x7fddb219fa40>>"

中間的四個子控件就是tabBarItem中對應的每個按鈕(到這里就可以類比UIButton的思想來繼續(xù)了),它有沒有可能也是繼承自UIControl的一種按鈕類型?
layoutSubviews中添加下面的代碼:

 for (UIView *tabBarButton in self.subviews) {
     if ([tabBarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) { // 之所以這么寫是因為UITabBarButton是蘋果私有API
         NSLog(@"%@",tabBarButton.superclass);
       }
  }

打印出的結果不出所料正是UIControl,那么就可以添加addTarget的監(jiān)聽方法;

(3) 由于需求只是讓tabBarButton上的圖片進行動畫,因此我們通過打印tabBarButton的子控件,可以找到其中展示圖片的imageView,把動畫添加到這個imageView的layer上就可以了;打印結果如下:

"<UITabBarSwappableImageView: 0x7fd7ebc52760; frame = (32 5.5; 25 25); opaque = NO; userInteractionEnabled = NO; tintColor = UIDeviceWhiteColorSpace 0.572549 1; layer = <CALayer: 0x7fd7ebc52940>>",
"<UITabBarButtonLabel: 0x7fd7ebc4f360; frame = (29.5 35; 30 12); text = '\U8d2d\U7269\U8f66'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fd7ebc4e090>>"

在監(jiān)聽的方法中,通過與第(2)步類似的步驟,拿到這個ImageView,添加動畫就可以了;當然也可以給label添加動畫,也可以給整個tabBarButton添加動畫;

完整的代碼如下:

- (void)layoutSubviews{
    [super layoutSubviews]; 
    for (UIControl *tabBarButton in self.subviews) { 
        if ([tabBarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
            [tabBarButton addTarget:selfaction:@selector(tabBarButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        }
    } 
}

- (void)tabBarButtonClick:(UIControl *)tabBarButton
{ 
    for (UIView *imageView in tabBarButton.subviews) { 
        if ([imageView isKindOfClass:NSClassFromString(@"UITabBarSwappableImageView")]) {
            //需要實現(xiàn)的幀動畫,這里根據需求自定義
            CAKeyframeAnimation *animation = [CAKeyframeAnimationanimation];         
            animation.keyPath = @"transform.scale";   
            animation.values = @[@1.0,@1.3,@0.9,@1.15,@0.95,@1.02,@1.0];   
            animation.duration = 1;
            animation.calculationMode = kCAAnimationCubic;
            //把動畫添加上去就OK了
            [imageView.layeraddAnimation:animation forKey:nil];  
      }
   }
}

最后實現(xiàn)的效果如下:


測試動畫.gif

總結

因此,如果以后只是單純的實現(xiàn)tabBarItem上的動畫,不需要對tabBar進行大刀闊斧的改動,也可以嘗試用這種方法來做;
今天就先侃到這里了,小弟只是拋磚引玉,大家有建議的話可以留言給我,共同玩耍于iOS樂園;
散了散了,回家收衣服了~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子禁悠,更是在濱河造成了極大的恐慌,老刑警劉巖琉用,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡辽聊,警方通過查閱死者的電腦和手機痴脾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門颤介,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赞赖,你說我怎么就攤上這事滚朵。” “怎么了前域?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵辕近,是天一觀的道長。 經常有香客問我匿垄,道長移宅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任椿疗,我火速辦了婚禮漏峰,結果婚禮上,老公的妹妹穿的比我還像新娘届榄。我一直安慰自己浅乔,他們只是感情好,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布铝条。 她就那樣靜靜地躺著靖苇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪班缰。 梳的紋絲不亂的頭發(fā)上贤壁,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音鲁捏,去河邊找鬼芯砸。 笑死,一個胖子當著我的面吹牛给梅,可吹牛的內容都是我干的假丧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼动羽,長吁一口氣:“原來是場噩夢啊……” “哼包帚!你這毒婦竟也來了?” 一聲冷哼從身側響起运吓,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤渴邦,失蹤者是張志新(化名)和其女友劉穎疯趟,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體谋梭,經...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡信峻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓮床。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盹舞。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隘庄,靈堂內的尸體忽然破棺而出踢步,到底是詐尸還是另有隱情,我是刑警寧澤丑掺,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布获印,位于F島的核電站,受9級特大地震影響街州,放射性物質發(fā)生泄漏兼丰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一地粪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧琐谤,春花似錦、人聲如沸斗忌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眶蕉。三九已至,卻和暖如春唧躲,著一層夾襖步出監(jiān)牢的瞬間造挽,已是汗流浹背弄痹。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肛真,地道東北人谐丢。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乾忱。 傳聞我的和親對象是個殘疾皇子讥珍,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫窄瘟、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,022評論 4 62
  • 在iOS中隨處都可以看到絢麗的動畫效果蹄葱,實現(xiàn)這些動畫的過程并不復雜,今天將帶大家一窺iOS動畫全貌新蟆。在這里你可以看...
    F麥子閱讀 5,094評論 5 13
  • 五毛錢右蕊,很小的時候,還不認識錢饶囚,于是偷了五毛錢去買兩毛錢的一根雪糕帕翻,其實整件事我已經不記得了萝风,只是偶爾被我哥提起,...
    你的晚安閱讀 167評論 0 0
  • 一规惰、概述 經過前面三篇文章的分析: 繪制流程 - Measure 繪制過程 - Layout 繪制過程 - Dra...
    澤毛閱讀 1,339評論 1 2