UITabBar添加动画

前几天有个需求,就是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];
        }
    }
}

至于动画效果,则可以根据个人爱好、不同需求来实现。上面是实现了播放帧动画的效果。

菜鸟笔记!希望对你有帮助

你可能感兴趣的:(UITabBar添加动画)