前幾天有個需求,就是UITabBar添加動畫,一開始沒啥好的思路,就去網(wǎng)上搜了一下有動畫效果的Demo,看了一些別人實現(xiàn)的代碼思路,總感覺有點繁瑣,最后找到了一種比較簡潔方便的辦法:
動畫的實現(xiàn),其本質(zhì)來講就是拿到需要實現(xiàn)動畫的UIView,然后把需求動畫添加到它的layer上就可以了。其實UITabBar也一樣,我們只要獲取到UITabBar顯示圖片的那個UIImageView,再往它的layer上加動畫就可以了。
1、創(chuàng)建一個繼承UITabBarController的類SCTabBarController,創(chuàng)建這個是為了把TabBarController的一些樣式及子viewControllers的代碼都統(tǒng)一寫在這里。
2、在viewDidLayoutSubviews方法里去遍歷tabBar.subviews,先找到繼承UITabBarButton類的控件,然后給添加一個點擊事件,設(shè)置一個tag來標示是第幾個tabBar:
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
///注意:每次顯示的時候需初始化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來獲取到需要添加動畫的那個UIImageView,接下去就可以添加動畫了:
///tabbar點擊執(zhí)行動畫事件
- (void)tabBarButtonClick:(UIControl *)tabBarButton {
for (UIImageView *imageView in tabBarButton.subviews) {
if ([imageView isKindOfClass:NSClassFromString(@"UITabBarSwappableImageView")]) {
// 需要實現(xiàn)的幀動畫,這里根據(jù)需求自定義
NSMutableArray *array = [NSMutableArray array];
for(NSUInteger i = 1; i < 9 ;i++) {
switch (tabBarButton.tag) {
case 1000:{ ///首頁
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;
}
}
///添加動畫
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
animation.delegate = self;
animation.values = array;
animation.duration = 0.3;
animation.calculationMode = kCAAnimationCubic;
[imageView.layer addAnimation:animation forKey:nil];
}
}
}
至于動畫效果,則可以根據(jù)個人愛好、不同需求來實現(xiàn)。上面是實現(xiàn)了播放幀動畫的效果。
菜鳥筆記!希望對你有幫助