前几天有个需求,就是UITabBar添加动画,一开始没啥好的思路,就去网上搜了一下有动画效果的Demo,看了一些别人实现的代码思路,总感觉有点繁琐,最后找到了一种比较简洁方便的办法:
动画的实现,其本质来讲就是拿到需要实现动画的UIView,然后把需求动画添加到它的layer上就可以了。其实UITabBar也一样,我们只要获取到UITabBar显示图片的那个UIImageView,再往它的layer上加动画就可以了。
1、创建一个继承UITabBarController的类SCTabBarController,创建这个是为了把TabBarController的一些样式及子viewControllers的代码都统一写在这里。
2、在viewDidLayoutSubviews方法里去遍历tabBar.subviews,先找到继承UITabBarButton类的控件,然后给添加一个点击事件,设置一个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点击执行动画事件
- (void)tabBarButtonClick:(UIControl *)tabBarButton {
for (UIImageView *imageView in tabBarButton.subviews) {
if ([imageView isKindOfClass:NSClassFromString(@"UITabBarSwappableImageView")]) {
// 需要实现的帧动画,这里根据需求自定义
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];
}
}
}
至于动画效果,则可以根据个人爱好、不同需求来实现。上面是实现了播放帧动画的效果。
菜鸟笔记!希望对你有帮助
网友评论