前幾天有個(gè)需求,就是UITabBar添加動(dòng)畫放妈,一開始沒啥好的思路,就去網(wǎng)上搜了一下有動(dòng)畫效果的Demo荐操,看了一些別人實(shí)現(xiàn)的代碼思路芜抒,總感覺有點(diǎn)繁瑣,最后找到了一種比較簡(jiǎn)潔方便的辦法:
動(dòng)畫的實(shí)現(xiàn)托启,其本質(zhì)來講就是拿到需要實(shí)現(xiàn)動(dòng)畫的UIView,然后把需求動(dòng)畫添加到它的layer上就可以了宅倒。其實(shí)UITabBar也一樣,我們只要獲取到UITabBar顯示圖片的那個(gè)UIImageView屯耸,再往它的layer上加動(dòng)畫就可以了拐迁。
1、創(chuàng)建一個(gè)繼承UITabBarController的類SCTabBarController疗绣,創(chuàng)建這個(gè)是為了把TabBarController的一些樣式及子viewControllers的代碼都統(tǒng)一寫在這里线召。
2、在viewDidLayoutSubviews方法里去遍歷tabBar.subviews多矮,先找到繼承UITabBarButton類的控件缓淹,然后給添加一個(gè)點(diǎn)擊事件,設(shè)置一個(gè)tag來標(biāo)示是第幾個(gè)tabBar:
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
///注意:每次顯示的時(shí)候需初始化tag
self.kTabBarButtonTag = 1000;
for (UIControl *tabBarButton in self.tabBar.subviews) {
if ([tabBarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
tabBarButton.tag = self.kTabBarButtonTag;
self.kTabBarButtonTag = self.kTabBarButtonTag + 1;
[tabBarButton addTarget:self action:@selector(tabBarButtonClick:) forControlEvents:UIControlEventTouchUpInside];
}
}
}
3、然后在tabBarButtonClick方法里割卖,在通過遍歷tabBarButton.subviews來獲取到需要添加動(dòng)畫的那個(gè)UIImageView前酿,接下去就可以添加動(dòng)畫了:
///tabbar點(diǎn)擊執(zhí)行動(dòng)畫事件
- (void)tabBarButtonClick:(UIControl *)tabBarButton {
for (UIImageView *imageView in tabBarButton.subviews) {
if ([imageView isKindOfClass:NSClassFromString(@"UITabBarSwappableImageView")]) {
// 需要實(shí)現(xiàn)的幀動(dòng)畫,這里根據(jù)需求自定義
NSMutableArray *array = [NSMutableArray array];
for(NSUInteger i = 1; i < 9 ;i++) {
switch (tabBarButton.tag) {
case 1000:{ ///首頁(yè)
UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"home_highlight_00%ld",i]];
CGImageRef cgimg = img.CGImage;
[array addObject:(__bridge UIImage *)cgimg];
} break;
case 1001:{ ///生活
UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"life_highlight_00%ld",i]];
CGImageRef cgimg = img.CGImage;
[array addObject:(__bridge UIImage *)cgimg];
} break;
case 1002:{ ///鄰里
UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"neighbor_highlight_00%ld",i]];
CGImageRef cgimg = img.CGImage;
[array addObject:(__bridge UIImage *)cgimg];
} break;
case 1003:{ ///我的
UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"mine_highlight_00%ld",i]];
CGImageRef cgimg = img.CGImage;
[array addObject:(__bridge UIImage *)cgimg];
} break;
default:
break;
}
}
///添加動(dòng)畫
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
animation.delegate = self;
animation.values = array;
animation.duration = 0.3;
animation.calculationMode = kCAAnimationCubic;
[imageView.layer addAnimation:animation forKey:nil];
}
}
}
至于動(dòng)畫效果,則可以根據(jù)個(gè)人愛好鹏溯、不同需求來實(shí)現(xiàn)罢维。上面是實(shí)現(xiàn)了播放幀動(dòng)畫的效果。
菜鳥筆記丙挽!希望對(duì)你有幫助